2010-05-21 62 views
7

我有一段代碼從本地文件系統中循環讀取很多(幾十萬)相對較小文件(幾KB)的地獄。對於每個文件,都會創建一個java.io.FileInputStream來讀取內容。這個過程非常緩慢,需要很長時間。緩衝FileInputStream怎麼樣?

你認爲包裹FIS爲java.io.BufferedInputStream將作出顯著差異?

+4

爲什麼不嘗試自己衡量差異?這是瞭解它如何在您的環境中工作的唯一方法,使用您的JVM等。 – 2010-05-21 12:43:36

+1

我已經在我的環境中對此進行了實際測量。將FIS包裝到BIS中沒有什麼大的改進。 – 2010-05-24 15:35:27

回答

9

如果您尚未使用的讀/寫循環(最新執行的BufferedInputStream使用8KB)一個體面的大小的byte[] buffer,那麼它將肯定化妝差別。試一試吧。不要忘記製作任何OutputStream a BufferedOutputStream

但是,如果您已經使用byte[]和/或它已經緩衝了它並且/或它畢竟只有很小的差別,那麼您已經將硬盤和I/O控制器的速度作爲瓶頸。

3

我很懷疑這是否會令任何區別。

你的根本問題是數以百計的小文件throusands的。閱讀這些內容會讓磁盤肆虐,無論你如何操作,你都會花99.9%的時間等待硬盤內的機械運動。

有兩種方法來解決這個問題:

  • 節省SSD上你的數據 - 它們具有低得多(如在幅度較少的五個數量)延遲。
  • 重新安排你的數據轉換成幾個大文件和讀取那些順序
3

這取決於你如何讀取數據。如果您以非常低效的方式從FileInputStream中讀取數據(例如,逐字節地調用read()),那麼使用BufferedInputStream可以顯着改善事情。但是,如果您已經在FileInputStream中使用合理大小的緩衝區,則切換到BufferedInputStream無關緊要。

既然你說有大量的小文件,有一個很大的可能性,大量的延遲是由於目錄操作(開,關),而不是從文件的字節的實際讀數。