java向excel 寫入海量資料記憶體溢位問題 解決
由於專案中有匯出海量資料的需求,在谷歌和百度也沒有找到好的解決辦法,經過仔細研究發現poi-3.8版本以上提供新的模式可以滿足這個需求,寫在這裡希望能對有同樣需求的同行們有所幫助。
以下是測試程式碼:
import java.io.FileOutputStream;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @description:TestA
* @author :liuf
* @since :2020/11/11 9:57
*/
public class TestA {
/*** @param args*/
public static void main(String[] args) {
if (args[0].equals("hssf")) {
hssfTest();
}
if (args[0].equals("sxssf")) {
sxssfTest();
}
}
public static void sxssfTest() {
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sh = wb.createSheet();
int rownum = 0;
try {
while (true) {
Row row = sh.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);
}
System.out.println(rownum);
rownum++;
if (rownum >= 1000000) break;
}
FileOutputStream out = new FileOutputStream("c:/sxssf.xlsx");
wb.write(out);
out.close();
} catch (Exception e) {
System.out.println(ExceptionUtils.getFullStackTrace(e));
}
}
public static void hssfTest() {
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sh = wb.createSheet();
int rownum = 0;
try {
while (true) {
Row row = sh.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);
}
System.out.println(rownum);
rownum++;
if (rownum >= 1000000) break;
}
FileOutputStream out = new FileOutputStream("c:/hssf.xlsx");
wb.write(out);
out.close();
} catch (Exception e) {
System.out.println(ExceptionUtils.getFullStackTrace(e));
}
}
}
將工程打包成jar到C:,然後用命令列java -jar -Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M test.jar hssf 執行,在命令列視窗輸出到45000之後,輸出明顯減慢,
很快輸出如下異常:
5028850289502905029150292 Exception in thread “main”
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)Caused by:java.lang.OutOfMemoryError:Java heap space
繼續用命令列java -jar -Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M test.jar sxssf執行,
命令列視窗輸出速度一直保持不變,直到迴圈完了,並最終生成四十多M的excel—sxssf.xlsx
相關文章
- java 讀 大檔案excel 記憶體溢位 解決JavaExcel記憶體溢位
- 記憶體溢位問題記憶體溢位
- POI實現大資料EXCLE匯入匯出,解決記憶體溢位問題大資料記憶體溢位
- [jenkins]解決jenkins記憶體溢位問題Jenkins記憶體溢位
- 解決POI大資料匯出Excel記憶體溢位、應用假死大資料Excel記憶體溢位
- 記憶體溢位的問題記憶體溢位
- Java記憶體溢位Java記憶體溢位
- Java記憶體溢位的詳細解決方案Java記憶體溢位
- 谷歌安卓5.1.1即將推送:解決記憶體溢位問題谷歌安卓記憶體溢位
- 解決記憶體溢位九法記憶體溢位
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- Android有效解決載入大圖片時記憶體溢位的問題Android記憶體溢位
- tomcat記憶體溢位問題記錄Tomcat記憶體溢位
- 記憶體和棧溢位問題定位記憶體
- java 程式記憶體溢位Java記憶體溢位
- 手動寫java記憶體溢位 java.lang.StackOverflowErrorJava記憶體溢位Error
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位
- Nuxtjs node memory 記憶體溢位問題UXJS記憶體溢位
- 基礎學習-記憶體溢位問題記憶體溢位
- Java記憶體溢位情況Java記憶體溢位
- Windows Tomcat 記憶體溢位解決方法WindowsTomcat記憶體溢位
- WEBLOGIC 記憶體溢位 解決方案(轉)Web記憶體溢位
- 解決SqlServer執行指令碼,檔案過大,記憶體溢位問題SQLServer指令碼記憶體溢位
- Java程式碼執行記憶體溢位詳解及解決方案Java記憶體溢位
- 記憶體溢位記憶體溢位
- 記一次記憶體溢位問題的排查、分析過程及解決思路記憶體溢位
- tomcat記憶體溢位問題監控工具Tomcat記憶體溢位
- tomcat記憶體溢位:PermGen space解決方法Tomcat記憶體溢位
- 手動寫java記憶體溢位 java.lang.OutOfMemoryError: PermGen spaceJava記憶體溢位Error
- JVM面試問題系列:深入詳解JVM 記憶體區域及記憶體溢位分析JVM面試記憶體溢位
- Java虛擬機器01——Java記憶體資料區域和記憶體溢位異常Java虛擬機記憶體溢位
- JAVA記憶體區域與記憶體溢位異常Java記憶體溢位
- java 匯出 excel 最佳實踐,java 大檔案 excel 避免OOM(記憶體溢位) excel 工具框架JavaExcelOOM記憶體溢位框架
- 揭露 FileSystem 引起的線上 JVM 記憶體溢位問題JVM記憶體溢位
- JBOSS記憶體溢位記憶體溢位
- 記憶體溢位:native溢位 和 上層溢位記憶體溢位
- tomcat伺服器記憶體溢位解決方法Tomcat伺服器記憶體溢位
- Android圖片記憶體溢位的解決方案Android記憶體溢位