内存不足错误 – 写入Excel时的Java堆空间
我有一个近100,000条logging的数据,我试图通过Java代码使用XSSFWorkbook
将数据写入.xlsx
文件。 我能够从数据库中获取所有数据到一个ArrayList
。 通过迭代ArryList
,我将数据ArryList
写入.xlsx
文件。 当它达到8000行时,java代码会抛出Out of Memory Heap Space
错误。
我曾经读过SXSSFWorkbook
比XSSFWorkbook
更轻,所以我尝试使用SXSSFWorkbook
。 但是我仍然面临同样的问题。
那么有什么我失踪的工作簿或与我的Java代码?
最初,当我有6万条logging数据时,我使用了.xls
文件。 相同的java代码可以用HSSFWorkbook
生成.xls
文件。
增加Java堆空间并不是一种select,因为我的数据将来会大大增加。
任何帮助将不胜感激。
一小段代码,我将数据写入Excel的方式。
int rowNum = sheet.getLastRowNum(); Row lastRow = null ; Cell cell = null; ReportingHelperVo reportingHelperVo = null; for (ReportingVo reportingVo : reportingVos) { rowNum++; lastRow = sheet.createRow(rowNum); reportingHelperVo = reportingVo.reportingHelperVo; cell = lastRow.createCell(0); cell.setCellValue(reportingHelperVo.getLocation()); cell.setCellStyle(style); cell = lastRow.createCell(1); cell.setCellValue(reportingHelperVo.getCity()); cell.setCellStyle(style); cell = lastRow.createCell(2); cell.setCellValue(reportingHelperVo.getCountry()); cell.setCellStyle(style); }
XSSFWorkbook – 为所有Excel文档创build对象表示(应该像DOM一样工作)。
SXSSFWorkbook – 应该需要不断的记忆。 JMV何时抛出OOM? 你使用了什么types的ResultSet ? 尝试使用FORWARD_ONLY来限制从数据库检索的JDBC驱动程序的caching数据。
BTW最好的修复OutOfMemoryError是分析堆转储。 使用-XX:+ HeapDumpOnOutOfMemoryError参数和MAT来了解您的应用程序的工作方式。
我正在逐个单元格地将数据写入.xlsx文件。 当它达到8000行时,Java代码会抛出内存堆空间错误。
重复使用现有的java对象,而不是每次迭代创buildnew
的对象。
和/或使用csv文件而不是Excel。
来自数据库的页面结果,而不是一口气读完。
我很久以前曾尝试从R写入excel文件(但是使用XLConnection)有类似的问题。 最后,我通过使用write.csv解决,然后用Excel打开并使用“文本到列”来解决。 这是快速和可靠的。
SXSSFWorkbook
不像重量轻,但有一个优势。
如果你声明为
SXSSFWorkbook workbook= new SXSSFWorkbook(200);
那么对于写在工作簿上的每200行,内存将被刷新到磁盘空间,所以在堆空间中将没有负担。
当我的excel达到3000行时,我遇到了同样的问题。 在我的情况下,POI Excel生成的主要内存相关问题发生在样式表中。 以下是我从我的代码中删除的东西。
- 尝试在行级别使用样式表设置。
- 如果您需要为每个单元格设置样式表,请避免为每个单元格设置边框。
Workbook workBook = new SXSSFWorkbook();
您可以导出超过10万(100000)个logging。
您好使用最新的Apache POI JAR //并使用SXSSF进行stream式传输或下载
SXSSFWorkbook workbook = new SXSSFWorkbook(100); workbook.setCompressTempFiles(true); Sheet sh = workbook.createSheet(); ((SXSSFSheet) sh).setRandomAccessWindowSize(100);
//写下你的逻辑
response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename="+filename+".xlsx"); workbook.write(response.getOutputStream()); workbook.close(); workbook.dispose();
- 使用NPOI的.xlsx文件有问题的损坏 – Excel无法打开文件“file.xlsx”,因为文件格式或文件扩展名无效
- 从工作表1引用工作表2中的单元格会导致超出范围错误
- 通过apache-poi更改Excel中单元格的值
- 如何使用Apache POI在单元格内为文本范围应用粗体文本样式?
- 如何使用Java和Apache POI将数据分割到MS Excel中的页面
- apache.poi HSSFCell getNumericCellValue读取不正确
- 如何使用Apache POI设置数据透视表字段格式单元格
- 使用Apache POI评估公式CELL时出现exception
- 保存下载到浏览器下载而不是使用java的系统