自称第1種兼業ミュージシャン?えむによるブログ 

POIのExcel出力で件数が多いとメモリオーバーするのを回避する方法

POIのExcel出力で件数が多いとメモリオーバーするのを回避する方法です。

まず、POIのExcel書き出し方法には、
わかっている範囲で3種類ありました。

○HSSF
 →古いExcel形式(xls)で書き出します。
  メモリがかさむ。

○XSSF
 →HSSFのバージョンアップ版
  新しいExcel形式(xlsx)で書き出します。
  
○SXSSF(今回はこれを採用)

 →XSSFの拡張版
  新しいExcel形式(xlsx)で書き出します。
  Excelの計算式が使えないなど、
  機能制限がある代わりに低メモリで出力できます。

---------------------------------------------------

SXSSFの詳細なところは↓のURLの下部をご確認ください。
英語引用ですが詳しく書いてます。

■参考URL
http://ppnlab.hatenablog.jp/entry/2013/12/01/223014


---------------------------------------------------
補足

◯ExcelのPOIについて

 ExcelのPOIはExcelデータ書き出しのときに使用するモードごとでjavaの実行空間(メモリ)の使用量が大幅に増減する。

 Excelを書き出すときには、書き出すデーターをbyte[]で全て保管しているため、10倍ぐらい実行空間を持って行く。
そのため、実行空間不足による例外や、システムに過負荷をかける。また、実行状態をタスクマネージャーで確認してい
ると、通常使用するモードではメモリーの解放が遅く、蓄積しやすいのに対し、書き出し専用の物は、書き出し終了後の
メモリー解放も早い。この違いが大きい物と思われる。

◯改修場所

 WorkBook を HSSFWorlbook → SXSSFWorkbook でインスタンス化したのみ。

 Sheetはもとのまま。

◯色々なAPI

 ☆読み込み専用

Event API(HSSF Only)

 ☆いつも使用する

User API(HSSF、SS?)

 ☆書き出し専用

Streaming API ← 今回使用 どうもExcel書き出し中にメモリーを解放しているみたい。(正式には.xmlsx)
また、書き込み専用なため、SXSSFSheetをcreateしたりはできない。getしてキャスト変換して使用する。

◯補足

 今回の改修後また処理が重くなったのであれば、初期値として通常モードでtemp(シート設定等のみ)を書き出して
SXSSFWorkbookをインスタンスするときにInputstreamとして渡して、SXSSFSheetを、SXSSFWorkbook.getSheetAt(0)で
設定して書き込みするとましになるかもしれない。
 
 
プロフィール
 
 

えむ

  • Author:えむ
  • 現在ベンチャー企業を経営する傍ら
    兼業ミュージシャンとして活動中。
    お問い合わせはこちらまで。
 
 
最近の記事
 
 
 
 
最近のコメント
 
 
 
 
最近のトラックバック
 
 
 
 
月別アーカイブ
 
 
 
 
カテゴリー
 
 
 
 
ブロとも申請フォーム
 
 
 
 
ブログ内検索
 
 
 
 
RSSフィード
 
 
 
 
リンク