2012-09-04 66 views
1

可能重複大量的小文件:
What is the fastest way to read a large number of small files into memory?有效地閱讀在Java中

我有大量的小文本文件(大小爲29個字節),但也有1000+這些。

我想讀取使用BufferedReader,但它似乎是相當緩慢考慮到所有文件都存儲在本地。我們嘗試了很少的這些文件(等12),讀數幾乎是瞬間的。

有沒有更有效的閱讀方式,或緩衝區的某處存在瓶頸?

謝謝!

+1

可以壓縮所有文件並使用某種聯合fs風格的虛擬文件系統? –

+0

@Keppil - 但請參閱我的答案對該問題進行反駁。 –

+0

如果你可以給我們更多關於你的問題的背景知識,也許天才可以提出替代解決方案來加快速度。例如,不是生成1000個以上的小文件,而是繼續追加到同一個文件中?或者,也許使用一些併發編程技術可以幫助提高性能? – Alvin

回答

1

瓶頸是最有可能在打開文件,並沒有太多你可以做的。

(第q &一個在評論中聯建議使用內存映射文件。但是,這直接違背其規定,建立映射的開銷是顯著的,你只是要得到一個放線Javadoc對於文件和A位數學的顯示,他的基準使用的文件有5642個字節的平均尺寸...相比,29個字節的文件大小是巨大的。)

你會得到的唯一途徑牽引力就在於如果你使用可輕鬆讀取/加載的輕量級格式將小文件合併爲一個大文件。除非您避免壓縮,否則ZIP並不是最好的主意。

+0

感謝您的建議!另一個考慮因素是文件是動態生成的,而且信息從每個文件都必須在創建時顯示,我不能將所有文件合併爲一個大文件,然後再顯示它。 – user990639

+0

@ user990639 - 它們是動態生成的事實並不意味着您不能將它們結合起來,這意味着你需要以不同的方式產生它們。 –

2

打開和關閉文件非常慢,特別是如果您有HDD。典型的HDD有8毫秒或大約每秒125的尋道時間。由於文件太小,閱讀內容並不重要。

我同意,內存映射文件纔有意義,如果你有

  • 在您的瓶頸是不是你的驅動器一個快速的磁盤子系統。
  • 文件是巨大的(GB到TB)

BTW:如果您使用的SSD,他們可以執行80K左右到230K IOPS這是相當快一點。

唯一的其他解決方案是組合文件。讀取一個64 KB的文件需要大約與讀取29個字節的文件相同的時間,但可以存儲數千倍的數據(並且需要數千次的文件)