我創建了執行以下操作的應用程序(C++):許多小文件或一個大文件? (或者開放的開銷和關閉文件句柄)
- 做一些計算,寫計算出的數據到一個文件 - 重複50萬次(總共寫500,000個文件) - 再重複2次(總共寫1.5個密爾文件)。從文件
- 讀數據,做一些激烈的計算從文件中的數據 - 重複了150萬次迭代(遍歷所有寫在步驟1中的文件)
- 重複步驟2 200次迭代。
每個文件都是〜212k,所以我有大約300Gb的數據。看起來整個過程需要花費大約40天才能在2.8 Ghz的Core 2 Duo CPU上運行。
我的問題是(你可能猜到)是完成整個過程所花費的時間。所有的計算都是串行的(每次計算都依賴於之前的計算),所以我不能將這個過程並行到不同的CPU或PC。我試圖考慮如何使這個過程更有效率,我敢肯定,大部分的開銷是文件系統訪問(呃......)。每次我訪問一個文件,我打開一個句柄,然後關閉它,一旦我讀完數據。
提高運行時間的一個想法是使用一個300Gb的大文件(或每個50Gb的幾個大文件),然後我只使用一個打開的文件句柄,並簡單地查找每個相關數據並閱讀它,但我不是什麼是打開和關閉文件句柄的開銷。有人可以對此有所瞭解嗎?
我的另一個想法是嘗試將文件分組到更大的〜100Mb文件,然後每次讀取100Mb而不是多個212K讀取,但實現起來比上述想法複雜得多。
無論如何,如果任何人都可以給我一些建議或有任何想法如何提高運行時間,我將不勝感激!
謝謝。
探查更新:
我跑的過程中探查,它看起來像計算需要運行時的62%和讀取文件需要34%。這意味着,即使我奇蹟般地將文件I/O成本削減了34倍,我仍然留下了24天,這是一個相當大的改進,但仍然很長時間:)
您是否考慮將其存儲在數據庫中? – 2009-07-29 05:27:56
我已經考慮過了,但這會使數據提取更快嗎? – dudico 2009-07-29 05:31:06
你說你很確定文件的打開/關閉是一個瓶頸。這是基於對程序進行分析的預感,還是更多的是一般預感?如果是後者,我會認真建議首先分析您的代碼。 – 2009-07-29 06:24:35