2012-05-04 12 views
2

ファイルからたくさんのデータを読み込んで、それをExcelファイルに書き込むコードがあります。問題は、データがヒープサイズの限界を超えたときにメモリ不足の例外が発生することです。ヒープサイズを増やしてみたところ、プログラムは正常に実行されました。しかし問題は、私のマシンにはRAMが限られていることです。ヒープに巨大なスペースを捧げると、マシンは非常に遅くなっています。だから、私のコードを実行するために私のヒープサイズを増やす必要がないように、データのいくつかの限界を処理した後にメモリを解放する方法はありますか?私はこの種のものに比較的新しいので、いくつかのアイデアを提案してください。避ける方法エクリプスでヒープサイズを増やさずにメモリ不足例外が発生する

+0

あなたのデータを読み書きするためのコードの小さなバージョンです(必要なものだけでなく、可能な限り小さくしてください)。私たちはそれについてコメントしています。 – Nanne

+0

http://stackoverflow.com/questions/2356137/read-large-files-in-javaこの問題を見てください。 –

+0

私はいくつかのファイルからデータを読んで、それを1回でExcelファイルに書き込む必要があります。 –

答えて

2

このような場合は、コードの再構成が必要になります。小さなバッファを作成し、データを読み込み、処理してExcelファイルに書き出します。次に、次の反復を続け、同じバッファーに読み込みます。

もちろん、使用しているExcelライブラリは、このように動作する必要があり、ファイル全体を一度に書き込む必要はありません。

0

私は、JXL APIはこの種の限られたバッファ機能を提供していると思います。これはオープンソースのAPIです。 http://jexcelapi.sourceforge.net/

0

DirectByteBufferをBuffer.allocateDirect(byteSize)で使用できます。またはMemoryMappedFileの場合、ヒープメモリからメモリ空間を使います。

+0

しかし、直接バッファを割り当てることで、OS /アーキテクチャ/ハードウェアによって課せられたメモリ制限に達した場合にOutOfMemoryErrorが発生する可能性があります。これは、彼のマシンにRAMが足りないとOPが言っているので、この場合に起こりそうです。 –

+0

したがって、データを永続ストレージ(HDD)に保存したり、Gsonを使用してディスクに保存したりすることができます – UsTa

関連する問題