Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

poiでのxlsxファイル読込について

javaのpoi(ver3.16)を使用してxlsxファイル(11M程度)の読込を行っていますが、途中で強制終了してしまいます。
ログを確認したところ、以下のメッセージが表示されていた為、メモリー不足によるものだと推測されますが、対応の手立てがなくて困っております。
尚、実行中のCPUは95%程度、メモリは50%程度になっています。

<ログ>
 Exception in thread "http-bio-8084-AsyncTimeout" java.lang.OutOfMemoryError: Java heap space
 Exception in thread "http-bio-8084-exec-19" java.lang.OutOfMemoryError: GC overhead limit exceeded
 Exception in thread "http-bio-8084-exec-15" Exception in thread "http-bio-8084-exec-27" java.lang.OutOfMemoryError: Java heap space
 java.lang.OutOfMemoryError: Java heap space

<環境>
 CPU 3.50GHz
 メモリ 8.0GB
 RAM 64bit

<コーディング>
        FileInputStream in
                = new FileInputStream(file_name);
        Workbook book = null;
        try {
            book = WorkbookFactory.create(in);
        } catch (EncryptedDocumentException e1) {
            e1.printStackTrace();
        } catch (InvalidFormatException e1) {
            e1.printStackTrace();
        }

<ヒープサイズ>
 -Xmx、-Xms共に1024M

xlsxはxlsに比べてinput、outputする際に使用されるメモリが大きいとのことですが、11M程度でもOutOfMemoryErrorになるとは思いませんでした。何か良い方法はないものでしょうか。

2

回答

804

閲覧

2件の回答

評価

0

xlsxは本来のデータをzip圧縮したものなので、11MBといっても実際にはもっと大きなものだ。
64bit環境ならもっと大きな領域を取ることもできると思うが、どのみち解決はできないだろう。
残念ながら、解決策は「POIは諦めて他のライブラリで読む」となる。

使ったことはないが、こんなものがあるようだ。
https://github.com/monitorjbl/excel-streaming-reader

評価

0

やはりpoiでは難しいのですね。
色々調べていたのですが、これで諦めがつきました。
詳しく教えていただきありがとうございました。

教えていただいたStreamingReaderを早速使用し、
組み込んだのですが、うまくいきませんでした。
これについては、また改めて質問させていただきます。
ご回答ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。