我想將一個1.5 GB的文件讀入數組中。 Now, as it takes long time,我想將它切換到其他選項。任何人都可以幫我,Java - 讀取字節數組中的文件
如果我預處理字節文件到一些數據庫(或可能以其他方式)我可以使它更快?
任何人都可以幫助我,有沒有其他方法可以使其更快。
其實,我必須處理超過50個1.5GB的文件。所以,such operation對我來說相當昂貴。
我想將一個1.5 GB的文件讀入數組中。 Now, as it takes long time,我想將它切換到其他選項。任何人都可以幫我,Java - 讀取字節數組中的文件
如果我預處理字節文件到一些數據庫(或可能以其他方式)我可以使它更快?
任何人都可以幫助我,有沒有其他方法可以使其更快。
其實,我必須處理超過50個1.5GB的文件。所以,such operation對我來說相當昂貴。
這取決於你想要做什麼。
如果你只想訪問幾個隨機字節,那麼讀入一個數組並不好 - 一個MappedByteBuffer會更好。
如果你想讀取所有的數據,並按順序處理它的一小部分,那麼你可以流它。
如果您需要對整個數據集進行隨機訪問,特別是如果您需要重複讀取元素,那麼加載到數組中可能是明智的(但ByteBuffer仍然是候選者)。
你可以展示一些示例代碼或進一步解釋嗎?
你的磁盤子系統有多快?
如果您可以讀取每秒40 MB的數據,則讀取1500 MB大約需要40秒。如果你想要比這更快,你需要一個更快的磁盤子系統。如果您正在從本地驅動器讀取數據並花費數分鐘時間,則會出現調整問題,並且您無法使用Java來解決此問題,因爲這不是問題所在。
您可以改爲使用內存映射文件,但如果您不需要所有數據,這隻會加快訪問速度。如果你需要這一切,你將受到硬件速度的限制。
如果你真的不需要讀取所有的字節,那麼一種更快的方法是不讀取整個文件。如果你需要每一個字節,那麼你可以嘗試通過只讀一次每個字節來改進。 – 2012-07-31 17:26:31
@MarkusMikkolainen,我需要處理每個字節。 – alessandro 2012-07-31 17:29:17
然後你是SOL,購買更快的磁盤。 – 2012-07-31 17:30:53
使用BufferedInputStream或InputStream的速度可能與獲得的速度一樣快(比RandomAccessFile快)。最大的整數大小是2,147,483,647,所以你可能會接近1,610,612,736的數組,這也是數組的最大值。
我建議您只需使用BufferedInputStream獲取文件以獲得最佳速度,skip()和read()即可獲取所需的數據。也許有一個實現這些類的類,知道它的位置,並在你發送一個偏移量來讀取時爲你尋找。我相信你會關閉並重新打開輸入流並將其放回到開頭。
而且......你可能不想將它們保存在一個數組中,只需要從文件中訪問它們。如果加載時間是你的殺手,這可能會有所幫助。
你爲什麼要將它們讀入數組? – 2012-07-31 17:18:06
以及爲什麼你閱讀50個這樣的文件?你打算怎麼處理他們? – 2012-07-31 17:19:19
你可能會加快一點,但真正的命中是預留那麼多的內存和磁盤io。解決這個問題的方法是基本上不將它加載到數組中。那麼你爲什麼要加載它呢? – 2012-07-31 17:19:23