2016-01-25 58 views
1

我的程序逐行讀取文本文件,在每行中提取特定類型的單詞(在單詞的哪一行找到這一點很重要)。 什麼會更好,通過文件分離線程(每個線程將讀取不同的文件)或將它們按行分開(每個線程將從同一個文件讀取不同的行)?C++ #pragma omp parallel:大任務還是小任務?

+2

同時實現並運行一些基準測試,同時置換文件及其大小的數量。 –

回答

3

除非你有多個硬盤驅動器,可能都沒有。

硬盤驅動器是固有地單線程 - 也就是說,它在任何給定時間僅產生單個數據流。通過一個實際的硬盤驅動器和一個在光盤周圍尋找磁頭的旋轉磁盤和磁頭,您的最佳吞吐量通常來自順序讀取。在文件中查找文件或在不同文件之間查找不同點可能會大大降低吞吐量。

如果你有多個驅動器,那麼它會取決於你的數據是如何在驅動器分佈式的,但最好你可能想是專用於從每個物理驅動器中讀取數據的一個線程。

如果你有足夠的處理,一旦它的讀取數據做的,你可以有一個線程讀取數據,並把這些數據轉化爲某種線程安全的隊列。從那裏你可以處理線程,處理單個數據項,處理它們,並將結果寫入...無論你想要輸出的地方。

如果這返回到一個文件(或多個文件),那麼您可能需要或多或少的相反的內容:將輸出寫入每個結果光盤的單個線程,並且處理線程將其數據存儲在某種隊列中。在典型情況下,這將是按數據寫入輸出文件的順序排列的優先級隊列,因此輸出線程始終按順序寫入數據。

2

取決於有多少文件有多少行有每個文件。

如果你在每個文件相對較少的線路,則並行化將是不值得的開銷。如果您處理的文件相對較少,也是如此。

總是可以平行兩者。

3

與往常一樣,在性能問題上,如果可行,您應該嘗試兩種方法並進行測量。但這裏是我的直覺說什麼:

如果文件大小差不多/採取類似的處理時間,給每個線程自己的文件可能是最好的。

許多線程訪問一個文件可能是唯一值得的,如果計算時間占主導地位的文件IO時間。

但是,你應該再次測量。對性能的猜測經常出現問題。由於@Jerry Coffinpoints out,這兩個文件都可能幫助你,但另一方面,這些文件可能已經預先加載到RAM中,在這種情況下,他的觀點可能適用或不適用(完全適用)。真的,試試看。這是一個廣泛的領域,很難預測。