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
相關文章
- POI實現大資料EXCLE匯入匯出,解決記憶體溢位問題大資料記憶體溢位
- Java棧溢位|記憶體洩漏|記憶體溢位Java記憶體溢位
- Java記憶體溢位Java記憶體溢位
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- 記憶體和棧溢位問題定位記憶體
- Windows Tomcat 記憶體溢位解決方法WindowsTomcat記憶體溢位
- 手動寫java記憶體溢位 java.lang.StackOverflowErrorJava記憶體溢位Error
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位
- 基礎學習-記憶體溢位問題記憶體溢位
- BufferedImage記憶體洩漏和溢位問題記憶體
- tomcat記憶體溢位:PermGen space解決方法Tomcat記憶體溢位
- Jmeter記憶體溢位:java.lang.OutOfMemoryError: Java heap space解決思路JMeter記憶體溢位JavaError
- 解決SqlServer執行指令碼,檔案過大,記憶體溢位問題SQLServer指令碼記憶體溢位
- Java程式碼執行記憶體溢位詳解及解決方案Java記憶體溢位
- 記一次記憶體溢位問題的排查、分析過程及解決思路記憶體溢位
- 記憶體溢位記憶體溢位
- tomcat伺服器記憶體溢位解決方法Tomcat伺服器記憶體溢位
- 手動寫java記憶體溢位 java.lang.OutOfMemoryError: PermGen spaceJava記憶體溢位Error
- Java記憶體區域與記憶體溢位異常 - 執行時資料區Java記憶體溢位
- Java虛擬機器01——Java記憶體資料區域和記憶體溢位異常Java虛擬機記憶體溢位
- Java EasyExcel 匯出報記憶體溢位如何解決JavaExcel記憶體溢位
- JAVA記憶體區域與記憶體溢位異常Java記憶體溢位
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- java 匯出 excel 最佳實踐,java 大檔案 excel 避免OOM(記憶體溢位) excel 工具框架JavaExcelOOM記憶體溢位框架
- JVM面試問題系列:深入詳解JVM 記憶體區域及記憶體溢位分析JVM面試記憶體溢位
- eclipse中啟動專案報記憶體溢位問題通過修改配置解決Eclipse記憶體溢位
- Laravel 使用 laravel-excel擴充套件包(maatwebsite/excel)匯入報記憶體溢位LaravelExcel套件Web記憶體溢位
- 手動寫java OOM記憶體溢位 java.lang.OutOfMemoryError: Java heap spaceJavaOOM記憶體溢位Error
- CSS解決文字溢位問題CSS
- 自己挖的坑自己填--jxl進行Excel下載堆記憶體溢位問題Excel記憶體溢位
- java記憶體溢位和記憶體洩漏的區別Java記憶體溢位
- JVM執行緒和記憶體溢位問題排查思路JVM執行緒記憶體溢位
- 揭露 FileSystem 引起的線上 JVM 記憶體溢位問題JVM記憶體溢位
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- 模擬實戰排查堆記憶體溢位(java.lang.OutOfMemoryError: Java heap space)問題記憶體溢位JavaError
- JVM(2)-Java記憶體區域與記憶體溢位異常JVMJava記憶體溢位
- Java解決遞迴造成的堆疊溢位問題Java遞迴
- 【記憶體洩漏和記憶體溢位】JavaScript之深入淺出理解記憶體洩漏和記憶體溢位記憶體溢位JavaScript