2012-07-31 49 views
0

我想將一個1.5 GB的文件讀入數組中。 Now, as it takes long time,我想將它切換到其他選項。任何人都可以幫我,Java - 讀取字節數組中的文件

如果我預處理字節文件到一些數據庫(或可能以其他方式)我可以使它更快?

任何人都可以幫助我,有沒有其他方法可以使其更快。

其實,我必須處理超過50個1.5GB的文件。所以,such operation對我來說相當昂貴。

+3

你爲什麼要將它們讀入數組? – 2012-07-31 17:18:06

+0

以及爲什麼你閱讀50個這樣的文件?你打算怎麼處理他們? – 2012-07-31 17:19:19

+2

你可能會加快一點,但真正的命中是預留那麼多的內存和磁盤io。解決這個問題的方法是基本上不將它加載到數組中。那麼你爲什麼要加載它呢? – 2012-07-31 17:19:23

回答

1

這取決於你想要做什麼。

如果你只想訪問幾個隨機字節,那麼讀入一個數組並不好 - 一個MappedByteBuffer會更好。

如果你想讀取所有的數據,並按順序處理它的一小部分,那麼你可以流它。

如果您需要對整個數據集進行隨機訪問,特別是如果您需要重複讀取元素,那麼加載到數組中可能是明智的(但ByteBuffer仍然是候選者)。

你可以展示一些示例代碼或進一步解釋嗎?

1

你的磁盤子系統有多快?

如果您可以讀取每秒40 MB的數據,則讀取1500 MB大約需要40秒。如果你想要比這更快,你需要一個更快的磁盤子系統。如果您正在從本地驅動器讀取數據並花費數分鐘時間,則會出現調整問題,並且您無法使用Java來解決此問題,因爲這不是問題所在。

您可以改爲使用內存映射文件,但如果您不需要所有數據,這隻會加快訪問速度。如果你需要這一切,你將受到硬件速度的限制。

+0

如果你真的不需要讀取所有的字節,那麼一種更快的方法是不讀取整個文件。如果你需要每一個字節,那麼你可以嘗試通過只讀一次每個字節來改進。 – 2012-07-31 17:26:31

+0

@MarkusMikkolainen,我需要處理每個字節。 – alessandro 2012-07-31 17:29:17

+0

然後你是SOL,購買更快的磁盤。 – 2012-07-31 17:30:53

0

使用BufferedInputStream或InputStream的速度可能與獲得的速度一樣快(比RandomAccessFile快)。最大的整數大小是2,147,483,647,所以你可能會接近1,610,612,736的數組,這也是數組的最大值。

我建議您只需使用BufferedInputStream獲取文件以獲得最佳速度,skip()和read()即可獲取所需的數據。也許有一個實現這些類的類,知道它的位置,並在你發送一個偏移量來讀取時爲你尋找。我相信你會關閉並重新打開輸入流並將其放回到開頭。

而且......你可能不想將它們保存在一個數組中,只需要從文件中訪問它們。如果加載時間是你的殺手,這可能會有所幫助。