2015-05-24 30 views
-1

我需要將一個非常大的文件(1.11gb)讀入內存並以字節爲單位進行處理。我做這件事的唯一方法是使用一個ArrayList(我不能使用一個字節[],因爲那麼它將超出限制)。 沒有辦法讓文件變小(我用它作爲測試來測試我的程序處理數據的時間)。 然後我需要將一個ArrayList作爲一個文件放回到硬盤驅動器(仍然是1.11GB) 我並不擔心寫作,因爲我正在閱讀。 速度也是至關重要的,所以要避免子分段,除非任何人在那裏都有快速的方法。從ArrayList中讀取/寫入文件內容<Byte>

+3

請解釋:_I不能用一個byte []因爲那將超過limit_ –

+1

'ArrayList的'是'的byte []'引擎蓋 – kaykay

+4

@kaykay不,它不是,它是一個對象下[] 。它使用4或8倍於字節數組的內存。 – immibis

回答

3

您試圖以錯誤的方式解決此問題(並且它不會工作)。

解決這個可能的方法是:

  • 重新設計算法,它不需要讀取整個文件到內存......一氣呵成。

  • 將數據讀取到多個byte[]對象中以避開2^31數組大小限制。

  • 使用多個ByteBuffer對象映射文件;見Java MemoryMapping big files


1 - 它不會起作用,因爲ArrayListObject[]內,因此是受您與字節數組相同的限制。另外,ArrayList<Byte>將佔用比代表相同字節數的byte[]多4至8倍的內存。或者更多,如果用Byte填充ArrayList<Byte>對象實例化方式不正確。

2 - 的Buffer的API都使用int大小和偏移量,以及(AFAIK)不支持的文件> = 2^31字節映射到單個Buffer