C#-使用StreamReader并行化While循环导致CPU过多 - c#

SemaphoreSlim sm = new SemaphoreSlim(10);

using (FileStream fileStream = File.OpenRead("..."))
using (StreamReader streamReader = new StreamReader(fileStream, Encoding.UTF8, true, 4096))
{
    String line;
    while ((line = streamReader.ReadLine()) != null)
    {
        sm.Wait();
        new Thread(() =>
        {
            doSomething(line);
            sm.Release();
        }).Start();
    }
}
MessageBox.Show("This should only show once doSomething() has done its LAST line.");

因此,我有一个非常大的文件,我想在每一行上执行代码。

我想并行执行,但一次最多只能执行10次。

我的解决方案是使用SemaphoreSlim等待并在线程完成时释放。 (由于该函数是同步的,因此.Release()的放置有效)。

问题是代码占用了大量CPU。内存的运行情况与预期的一样,而不是加载超过400mb,而是每几秒钟上升和下降几mbs。

但是CPU发疯了,它的大部分时间都锁定在100%的状态下持续了30秒钟,然后略微下降并返回。

既然我不想将每一行都加载到内存中,并且想要一直运行代码,那么最好的解决方案是什么?

在9700行文件中输入500行。

C#-使用StreamReader并行化While循环导致CPU过多 - c#

在270万行文件中包含600行。

C#-使用StreamReader并行化While循环导致CPU过多 - c#

编辑

如注释中所述,我从new Thread(()=>{}).Start();更改为Task.Factory.StartNew(()=>{});,看来线程创建和销毁正在导致性能下降。这似乎是正确的。当我移到Task.Factory.StartNew之后,它以与信号量所提到的相同的速度运行,并且它的CPU与我的Parallel.ForEach代码版本完全一样。

参考方案

您的代码创建了大量线程,效率很低。
C#具有处理场景的简便方法。一种方法是:

File.ReadLines(path, Encoding.UTF8)
    .AsParallel().WithDegreeOfParallelism(10)
    .ForAll(doSomething);

File.ReadLines不会读取整个文件,而是逐行读取。
使用WithDegreeOfParallelism设置并发执行任务的最大数量
使用ForAll在每一行上启动一个方法。

StreamReader.Read返回\ 0 - c#

我是编码的新手。我试图一次从文件中读取几个字符,我的代码如下所示。但是,当文件中的字符数少于请求的字符数时,它将向数组中返回\ 0,\ 0是什么意思。请帮助我理解。using (StreamReader sr = new StreamReader(m_segmentFile.TempFileName)) using (StreamWriter sw = ne…

while循环中的线程是否会将CPU时间分配给另一个相同类型的线程? - java

如果我有以下伪代码:public static void main(String[] args) { TestRunnable test1 = new TestRunnable(); TestRunnable test2 = new TestRunnable(); Thread thread1 = new Thread(test1); Thread thre…

如果在使用循环时不应该结束,则程序结束 - python

我正在做一个简单的计算器。想法是它可以循环自身以使用户结束程序。我在程序的末尾添加了一个if循环,但是程序在循环后关闭。请注意,当我删除最后一个if时,程序会循环正常。导入数学 while True: print("Calculadora version 1.0") print("""Operaciones …

虽然没有目的的循环? - java

在阅读一本Java教程时,我遇到了这段代码:while(getImage().getWidth(frame) <= 0);起初我以为这是一个错字,但在整本书中的多个地方重复了几次。不幸的是,关于它的作用没有任何解释,所以我想知道它的目的是什么。从表面上看,我知道它基本上什么也不做,因为即使它可以返回true或false,while语句也没有任何内容。这…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制