我有一個簡單的任務,很容易並行。基本上,必須在(大,幾個Gb)輸入文件的每一行上重複執行相同的操作。雖然我已經做了一個多線程版本,但我注意到我的I/O是瓶頸。我決定構建一個實用程序類,它涉及一個簡單的「文件讀取器」線程,它可以直接向前讀取並儘可能快地讀入循環緩衝區。然後,多個消費者可以打電話給這個班級並獲得他們的「下一行」。給定n個線程,每個線程我的起始行是文件中的第i行,並且通過添加n找到該線程的每個後續行。事實證明,這不需要鎖,幾個關鍵的原子操作就足以保存不變量。單文件閱讀器/多用戶模型:多線程程序的好主意?
我測試了代碼,它似乎更快,但經過第二次思考,我不知道爲什麼。將大文件分割成n個輸入文件(你可以'前進'到同一個文件中以達到同樣的效果,最少的預處理),然後讓每個進程只需調用iostream :: readLine就可以了它自己的塊? (因爲iostream也讀入它自己的緩衝區)。在多線程之間共享單個緩衝區似乎沒有任何固有的優勢,因爲工作人員實際上並不在相同的數據線上運行。另外,沒有什麼好方法我不認爲要並行化,以便它們在同一行上工作。我只是想了解我看到的性能增益,並知道它是'flukey'還是跨平臺可擴展/可重複的...
除順序文件讀取之外的任何其他操作都會造成更多的傷害,尤其是對於需要實際的機械磁盤操作來「真正」讀取不在磁盤/驅動器緩存中的數據的大型文件。我不太確定你的單個循環緩衝區設計。單個文本行的線程間通信不會很有效 - 太多的原子操作和讀取線程在解析行時應該填充緩衝區。我可能會帶着一個更大的緩衝區實例池。 –