背景
解決POIでJavaコンポーネントを使用して、以前に解決Excelのプロジェクトを引き継いだが、多くの場合、時間を解析するOOM、その後、私は問題解決の99%の下から次の側面を最適化し、はい、あなたはしませんでした間違っている、唯一の99%を取り上げました。
ソリューション
- JVMのヒープメモリを調整します
我々は、すべてのメモリの山を強調するために、ほぼすべてのJavaオブジェクトのインスタンスは、Javaヒープに格納されている、OOMヒープメモリが十分ではありません確かにそこにあることを知っています。
初期メモリと最大メモリが4グラムに調整された後、次のコマンドを実行すると、JVMのヒープを開始します。
java -Xms4g -Xmx4g
复制代码
- Excelのサイズ制限
時間の期間は、一部のExcelの写真を観察したり、数十シートのページを持っていますが、実際にはおそらく数百行をデータを解析する必要があるので、直接エクセルファイルをアップロード時間を制限された後のデータは、大きな上のより多くのメモリを取りますサイズ。
- POIは、ソースコードを変更します
まだそこに上記の2つの低周波OOMにもかかわらず、プログラムが、後に、後にExcelがPOIのOOMソースを追跡するいくつかのパケットは、我々は次のように処理されない空白行を指示するように変更、POIのオブジェクトが作成される空の行の多くを見つけましたA。
プロジェクトで使用されるPOIのバージョンは3.17であり、修飾はXSSFSheet.java initRows()メソッドコード、実際には、次のように変更し、コードのわずか3行(中括弧)の増加です。
private void initRows(CTWorksheet worksheetParam) {
_rows.clear();
tables = new TreeMap<String, XSSFTable>();
sharedFormulas = new HashMap<Integer, CTCellFormula>();
arrayFormulas = new ArrayList<CellRangeAddress>();
for (CTRow row : worksheetParam.getSheetData().getRowArray()) {
//修改poi源码 begin
if(row.getCArray().length<=0){
continue;
}
//修改poi源码 end
XSSFRow r = new XSSFRow(row, this);
// Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory
final Integer rownumI = new Integer(r.getRowNum()); // NOSONAR
_rows.put(rownumI, r);
}
}
复制代码
三つのプログラム上では十分でない場合は、メモや読みに基づいて、easyexcel、alibabaのオープンソースを使用することを検討してくださいを参照することができ、より知りたい:github.com/alibaba/eas ...
推奨読書
完全なデータベースミドルウェアMycat + SpringBootサブライブラリーのサブテーブルとあなたとの1手
3.アリインタビュアー:マイクロチャネルは、それぞれ、原則の実現について話と淘宝網のスキャンコードの後ろにログオンするには?
MyBatisの下に、動的SQLを理解するためにあなたに1分を取る4.!
あなたは記事が良いと思われる場合は、希望が容易に転送することができたり、「見て」ああ、あなたはとてもヘクタールをありがとう!
「1024」の下で世間の注目の後には返信があなたのために驚きを持っていません!