4

Excelの読み取りに最新のPOI3.5を使用しています。Excel MS Office 2007をインストールしていて、そのためにpoiがデータを実行するためのXSSFを提供しています。

15000行のデータの場合、正しく実行されていますが、30000、100000、または200000までの制限を超えると、Javaヒープスペースの例外が発生する傾向があります。

コードは以下の通りです:

UATinput = new FileInputStream(UATFilePath);

uatBufferedInputStream = new BufferedInputStream(UATinput);

UATworkbook = new XSSFWorkbook(uatBufferedInputStream);

Javaヒープサイズの最後の行で例外が発生しています。を使用してサイズを増やしました-Xms256m -Xmx1536mが、それでもデータが増えると、Javaヒープスペース例外が発生します。

XSSFWorbookのこの例外について誰かが私を助けてくれますか?

4

9 に答える 9

6

メモリ内のファイル全体を読み取る代わりに、eventusermodelapiを使用してみてください

これは、大きなファイルを読み取るための非常にメモリ効率の高い方法です。これは、特定のデータ構造に遭遇したときにコールバックメソッドを呼び出すという意味で、(DOMではなく)SAXパーサーの原則に基づいて機能します。基になるデータの要点を知っていることを期待しているため、少し注意が必要な場合があります

ここでは、このトピックに関する優れたチュートリアルを見つけることができます

お役に立てれば!

于 2010-01-29T07:21:52.607 に答える
1

UserEventModel を使用した後、私のパフォーマンスは素晴らしかったです。何か問題があれば、私に手紙を書いてください。djeakandane@gmail.com

于 2010-10-14T08:05:03.413 に答える
0

他の人が言っているように、あなたの最善の策は、イベントAPIを切り替えることです

ただし、小さな違いを生む1つのことは、ファイルを入力ストリームでラップしないことです。XSSFはファイルを入力として受け入れます。これは、InputStreamよりもメモリフットプリントが低くなります。これは、POIがコンテンツにランダムアクセスする必要があるためです。入力ストリームを使用する唯一の方法は、コンテンツ全体をメモリにバッファリングすることです。ファイルを使用すると、それはただ周りを探すことができます。InputStreamではなくFileを使用すると、メモリに相当するファイルのサイズを少し超える節約になります。

可能であれば、ファイルを渡す必要があります。メモリが不足している場合は、InputStreamをファイルに書き込んで使用してください。

于 2011-07-16T12:06:01.860 に答える
0

XLSXテクノロジーの背後にあるXMLデータグリッドを処理することを本当に楽しみにしています。ヒープスペースの問題から解放されます。チュートリアルは次のとおりです。以下の両方のリンクを確認してください。

http://poi.apache.org/spreadsheet/how-to.html

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/FromHowTo.java

解析とSAX-XMLプロジェクトの使用に関する基本的な知識が必要です。

于 2012-09-13T21:25:37.330 に答える
0

独自のコードで注目すべきもう 1 つのことは、「新規作成」しているオブジェクトの数です。セルを読み込んで大量のオブジェクトを作成すると、ヒープも使い果たす可能性があります。作成するオブジェクトの数に注意してください。

于 2010-02-08T05:16:50.863 に答える
0

JVM は、使用可能な固定メモリで実行されます。このメモリを超えると、「java.lang.OutOfMemoryError」を受け取ります。JVM は、起動時に使用可能なメモリを適切に選択しようとしますが (詳細については、Java 設定を参照してください)、次の設定でデフォルトを上書きできます。

パフォーマンスを向上させるために、JVM で特定のパラメーターを使用できます。Xms1024m - JVM で使用可能な最小メモリを 1024 メガバイトに設定します Xmx1800m - JVM で使用可能な最大メモリを 1800 メガバイトに設定します。Java アプリケーションは、このパラメータで定義された以上のヒープ メモリを使用できません。

コマンド ラインから Java プログラムを起動する場合は、たとえば次の設定を使用します: java -Xmx1024m YourProgram.

于 2013-01-24T13:09:52.767 に答える
0

XSSF の上に構築された低メモリ フットプリント SXSSF API である SXSSF を使用できます。" http://poi.apache.org/spreadsheet/how-to.html#sxssf "

于 2013-09-30T09:03:12.743 に答える
0

これを試してください: -Xms256m -Xmx512m.

于 2010-01-29T03:24:10.220 に答える
0

XSSFWorkbook を使用する場合、POI は Excel ファイル全体を含むメモリ モデルを作成する必要があるため、大量のメモリが消費されます。おそらく、ユーザー API ほど単純ではありませんが、メモリ消費量が少ないイベント APIを使用できます。

ちなみに、-Xmx により大きな値を設定することもできます...

于 2010-01-29T06:57:42.603 に答える