我有一段代碼從本地文件系統中循環讀取很多(幾十萬)相對較小文件(幾KB)的地獄。對於每個文件,都會創建一個java.io.FileInputStream
來讀取內容。這個過程非常緩慢,需要很長時間。緩衝FileInputStream怎麼樣?
你認爲包裹FIS爲java.io.BufferedInputStream
將作出顯著差異?
我有一段代碼從本地文件系統中循環讀取很多(幾十萬)相對較小文件(幾KB)的地獄。對於每個文件,都會創建一個java.io.FileInputStream
來讀取內容。這個過程非常緩慢,需要很長時間。緩衝FileInputStream怎麼樣?
你認爲包裹FIS爲java.io.BufferedInputStream
將作出顯著差異?
如果您尚未使用的讀/寫循環(最新執行的BufferedInputStream
使用8KB)一個體面的大小的byte[] buffer
,那麼它將肯定化妝差別。試一試吧。不要忘記製作任何OutputStream
a BufferedOutputStream
。
但是,如果您已經使用byte[]
和/或它已經緩衝了它並且/或它畢竟只有很小的差別,那麼您已經將硬盤和I/O控制器的速度作爲瓶頸。
我很懷疑這是否會令任何區別。
你的根本問題是數以百計的小文件throusands的。閱讀這些內容會讓磁盤肆虐,無論你如何操作,你都會花99.9%的時間等待硬盤內的機械運動。
有兩種方法來解決這個問題:
這取決於你如何讀取數據。如果您以非常低效的方式從FileInputStream中讀取數據(例如,逐字節地調用read()),那麼使用BufferedInputStream可以顯着改善事情。但是,如果您已經在FileInputStream中使用合理大小的緩衝區,則切換到BufferedInputStream無關緊要。
既然你說有大量的小文件,有一個很大的可能性,大量的延遲是由於目錄操作(開,關),而不是從文件的字節的實際讀數。
爲什麼不嘗試自己衡量差異?這是瞭解它如何在您的環境中工作的唯一方法,使用您的JVM等。 – 2010-05-21 12:43:36
我已經在我的環境中對此進行了實際測量。將FIS包裝到BIS中沒有什麼大的改進。 – 2010-05-24 15:35:27