Set*_*eth 5 .net c# multithreading
我有以下代码:
if (!this.writeDataStore.Exists(mat))
{
BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));
this.PushIntoDb(mat, imageFiles.ToList());
}
Run Code Online (Sandbox Code Playgroud)
DecompressAndReadGzFile是包含此方法的同一类中的静态方法.根据方法名称,我正在解压缩并读取gz文件,其中很多,即最多1000个,因此并行化的开销值得获益.但是,我没有看到好处.当我使用ANTS性能分析器时,我发现它们运行的时间与完全没有并行化的时间完全相同.我还使用进程资源管理器检查CPU内核,看起来可能在两个内核上完成了工作,但是一个内核似乎正在完成大部分工作.就Parallel.ForEach并行解压缩和读取文件而言,我不理解什么?
更新的问题:从文件列表中读取信息的最快方法是什么?
问题(简化):
在最初的问题中,我使用的是Parallel.ForEach循环,但我似乎并没有超过1个核心的CPU绑定.
Jon*_*eet 12
是否可能线程花费大部分时间等待IO?通过一次读取多个文件,您可能会使磁盘捶打多于单个操作.您可以通过顺序使用单个线程读取来提高性能,但随后将CPU绑定解压缩到单独的线程......但实际上您可能发现只需要一个线程执行解压缩,如果磁盘比解压缩过程本身慢.
测试这种方法的一种方法是首先将需要解压缩的文件复制到ramdisk上,然后仍然使用当前代码.我怀疑你会发现你受CPU限制,并且几乎所有的处理器都很忙.
(你还应该考虑你在解压缩文件中做了什么.你是把它们写回磁盘吗?如果是这样的话,你可能还在等待一个颠簸的磁盘.)
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |