web-dev-qa-db-ja.com

java.lang.OutOfMemoryError:Java Apache POIでExcelを読み取る際のヒープスペース

私のファイルは9MBで、ワークブックのロード中にこのエラーが発生しました。

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

この行はJava.lang.OutOfMemoryError: Java heap space

どうすればこれを解決できますか?

18
user467871

デフォルトのヒープサイズは128Mだと思います

これを増やすには、-Xmx引数を Java に使用します。

例えば.

Java -Xmx512m myapp.Java
9
Joel

最初に確認すること-XSSFWorkbookInputStreamまたはaFileファイルははるかに低いメモリ で開きます。

次に、読み書きしますか?メモリが非常に不足している場合は、saxのような方法でXSSFを使用するための代替オプションがあります。

読み取りについては、XSSF + Saxの使用の詳細について http://poi.Apache.org/spreadsheet/how-to.html#xssf_sax_api を参照してください。別のオプションとして、ファイルのテキストコンテンツのみを取得する場合、Apache TikaにPOIを使用した.xlsxファイル用のイベントベースのテキスト抽出機能があるようです。

執筆のために、「ビッググリッドデモ」の改善について最近POI開発者リストで多くの議論がありました。あなたはそれらをフォローしたいかもしれません- http://poi.Apache.org/mailinglists.html

25
Randomness

他の人が示唆しているように、最初にすることはヒープサイズを増やすことです。

それでも問題が解決しない場合、または大きなファイルが予想される場合は、この回答も確認してください。 Javaでの大きなxlsxファイルの処理

標準の「すべてを読む」モードが機能しない場合に実行できることについて、いくつかの優れた出発点を提供します。

3
Turismo

大きなファイルを書き込む場合:

必要なのは [〜#〜] sxssf [〜#〜] (Streaming Usermodel API)です。

SXSSF(パッケージ:org.Apache.poi.xssf.streaming)は、非常に大きなスプレッドシートを作成する必要があり、ヒープ領域が限られている場合に使用される、XSSFのAPI互換ストリーミング拡張機能です。

そのページにも例があります。XSSFWorkbookSXSSFWorkbookに置き換える必要があります。

別の質問 から vadchen からこの回答をコピーしました。それは私のために働いた。彼が言ったように、私はコードでXSSFWorkbookSXSSFWorkbookに置き換える必要がありました。

2
Vini

32ビットJVMには最大2GBのメモリがあると思いますが、これは時代遅れかもしれません。私が正しく理解していれば、Eclipseランチャーで-Xmxを設定しました。 Eclipseから実行するプログラムのメモリを増やしたい場合は、「実行->実行構成...」で-Xmxを定義する必要があります(クラスを選択して[引数]タブを開き、VM引数領域)メニュー、およびEclipse起動時ではない

編集:あなたが求めた詳細。 Eclipse 3.4

1)実行->実行構成...

2)クラスが「Javaアプリケーション」サブツリーの左側のリストにない場合は、左上隅の「新しい起動構成」をクリックします。

2b)右側の「メイン」タブで、プロジェクトとクラスが正しいものであることを確認します

3)右側の「引数」タブを選択します。これには2つのテキスト領域があります。 1つは、メインメソッドに提供されるargs []配列に入るプログラム引数用です。もう1つはVM引数用です。VM arguments(lower one iirc))のあるものに次のように入力します。-Xmx2048m

1024mはあなたが必要とするもののために十分すぎると思います!

4)「適用」をクリックし、次に「実行」をクリックします。

それでもヒープ領域が不足する場合は、数値をより高い値に変更できます。たとえば、合計が2ギガバイトから4ギガバイトになる-Xmx4gを置くことができます。

2
Ramin

ヒープサイズを増やします。

-Xms256m -Xmx512m -XX:PermSize = 64M -XX:MaxPermSize = 1000M

これらの値はVMに提供する必要があります。

へのリンクを見てください、これはあなたを助けるはずです

http://www.javabeat.net/tips/192-javalangoutofmemoryerror-Java-heap-space.html

1
harishtps