2012-05-04 42 views
2

我有一段代碼,它讀取文件中的大量數據並將其寫入excel文件。我所面臨的問題是,當數據超出堆大小的限制時,會拋出內存異常。我試圖增加堆大小和程序正常運行。但問題是,我的機器上的內存有限,如果我爲這個堆提供了巨大的空間,機器變得非常慢。那麼,在處理一些數據限制之後,有沒有辦法釋放內存,以便我不需要增加堆大小來運行我的代碼?我對這種東西比較新,所以請提出一些建議如何避免在不增加日誌上的堆大小的情況下發生內存異常

+0

向我們展示您的代碼(一個小的,自包含的等)的版本,您可以在其中讀取和寫入數據(但不是所有其他您可能需要的東西,儘可能小,但足以顯示行爲),我們可能會對此發表評論。 – Nanne

+0

http://stackoverflow.com/questions/2356137/read-large-files-in-java看看這個問題。 –

+0

我必須從一些文件中讀取數據,然後一次寫入一個excel文件。 –

回答

2

在這種情況下,您需要重構代碼,以便它可以處理小塊數據。創建一個小緩衝區,讀取數據,處理它並將其寫入Excel文件。然後繼續下一次迭代,讀入相同的緩衝區。

當然,您使用的Excel庫需要能夠像這樣工作,並且不應該要求一次寫入整個文件。

0

您可以使用DirectByteBuffer與Buffer.allocateDirect(byteSize);或MemoryMappedFile,它們使用堆內存中的內存空間。

+0

但是,如果達到OS /體系結構/硬件強加的內存限制,則分配直接緩衝區也會導致OutOfMemoryError。這種情況很可能發生在這種情況下,因爲OP說他的機器內存不足。 –

+0

因此,您可以將數據保存或保存到永久存儲(HDD),也許使用Gson將數據保存到磁盤 – UsTa

相關問題