2011-10-28 218 views
0

我想對數千個文件同時做一些處理。抓住所有文件的第一個字節並執行一些操作,轉到下一個字節等等。文件可以是任意大小,因此將它們全部加載到內存中可能會令人望而卻步。有沒有辦法有效地同時讀取多個文件?

我擔心,由於操作系統文件描述符的限制,只是天真地打開數千個文件並閱讀它們,似乎可能會遇到問題。

但我想,循環瀏覽和打開/關閉文件效率會很低。

是否有一些有效的機制來處理我想要做的事情?

注意:此功能可能會分發到使用我無法控制的機器,因此我不能只更改操作系統上的設置。

回答

0

我想同時處理數千個文件。抓取所有文件的第一個字節並執行操作,轉到下一個字節等。

這些文件是否足夠小,以至於您可以一次將它們全部讀入內存。如果是這樣,則一次讀取一個文件,然後逐個處理所有文件。

我擔心,由於操作系統文件描述符的限制,只是天真地打開數以千計的文件並閱讀它們似乎可能遇到問題。

你可能會。找出答案的唯一方法就是嘗試。

但我想,循環瀏覽和打開/關閉文件效率會很低。

是的。但是,如果您無法將所有文件讀入內存,並且您的操作系統無法一次打開數千個文件,那麼這是您的最後選擇。

你可以做的是找出系統可以處理的同時打開文件的限制。我們只是爲了討論的目的說,你的系統一次可以打開100個文件,並且你有2,500個文件要處理。

然後你的過程看起來像這樣。

  • 打開前100個文件。
  • 編寫一個輸出文件,其中包含100個文件中的第一個字節,然後是100個文件中的第二個字節,依此類推。
  • 處理任何可能遇到的問題,如果100個文件不是相同的字節長度。

現在,通過所有文件運行此過程後,您將擁有25箇中間文件。

然後你的第二個過程看起來像這樣。

  • 打開25箇中間文件。
  • 處理每個文件的前100個字節。

您可以通過對操作系統進行實驗或研究來確定實際數量(同時打開文件,中間文件數量)。

+0

換句話說,「不」。 :) 您的解決方法建議很有用,您可以將其寫入單個文件,因爲您可以跳過寫入字節並將其填入下一批。但是...如果這組文件是動態的 - 每次寫出新的組合文件可能需要比打開/關閉每個文件以獲得一個字節的最壞情況更長的時間。 – mentics

+0

@taotree:如果不進行實驗,我無法回答這個問題。如果這組文件是動態的,則會遇到更嚴重的問題,因爲您必須跟蹤您感興趣的字節位置,並一直讀取該字節位置以獲取您感興趣的字節。在2,500個文件上使用中間方法,可以打開和關閉2,525個文件,因爲您檢索的字節數很多。爲每個需要的字節打開和關閉2500個文件,特別是因爲它不是第一個字節,可能會有更高的輸入/輸出成本。 –

+0

對不起,當然你會一次加載塊 - 我寫的評論錯了。無論如何......問題是,是否有某種方法可以真正做到,但到目前爲止,答案似乎是否定的。所以,我必須做一些類型的解決方法。 – mentics

相關問題