【发布时间】:2011-11-11 16:18:54
【问题描述】:
我有以下代码:
if (!this.writeDataStore.Exists(mat))
{
BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));
this.PushIntoDb(mat, imageFiles.ToList());
}
DecompressAndReadGzFile 是包含此方法的同一类中的静态方法。根据方法名称,我正在解压缩和读取 gz 文件,其中很多,即最多 1000 个,因此并行化的开销是值得的它的好处。但是,我没有看到好处。当我使用 ANTS 性能分析器时,我看到它们运行的时间与没有发生并行化的时间完全相同。我还使用进程资源管理器检查了 CPU 内核,看起来可能在两个内核上完成了工作,但一个内核似乎正在完成大部分工作。就让 Parallel.ForEach 并行解压缩和读取文件而言,我不明白什么?
更新问题:从文件列表中读取信息的最快方法是什么?
问题(简化):
- 有大量 .gz 文件 (1200)。
- 每个文件都有一行包含“DATA:”,位置和行号不是静态的,可能因文件而异。
- 我们需要检索“DATA:”之后的第一个数字(为了简单起见)并将其存储在内存中的对象中(例如列表)
在最初的问题中,我使用的是 Parallel.ForEach 循环,但我的 CPU 似乎没有超过 1 个内核。
【问题讨论】:
-
DecompressAndReadGzFile有同步吗? -
我不知道。虽然有一个对 imageFiles.Add 的调用,它会根据我的理解自动添加一个锁。
标签: c# .net multithreading