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行。
在270万行文件中包含600行。
编辑
如注释中所述,我从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
在每一行上启动一个方法。
我是编码的新手。我试图一次从文件中读取几个字符,我的代码如下所示。但是,当文件中的字符数少于请求的字符数时,它将向数组中返回\ 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题解计算机为什么是基于二进制的?可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制