我有以下代碼:爲什麼Parallel.ForEach循環不能提高性能?
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並行解壓縮和讀取文件,我不理解什麼?
更新的問題:什麼是從文件列表中讀取信息的最快方法?
的問題(簡化):
- 有的。廣州文件(1200)大的列表。
- 每個文件都有一行包含「DATA:」的行,位置和行號不是靜態的,並且可以因文件而異。
- 我們需要後檢索的第一個數字「數據顯示:」(只是爲了簡單起見),並將其存儲在內存中的對象(如表)
在最初的問題,我用的是並行.ForEach循環,但我似乎沒有CPU綁定超過1核心。
在「DecompressAndReadGzFile」中是否有任何同步? – SimonC
不是我所知道的。雖然有一個imageFiles.Add的調用,它會自動添加我理解的鎖。 – Seth