OutofMemory:从InputStream

时间:2015-11-17 12:17:56

标签: java excel apache apache-poi inputstream

我正在尝试在Web服务器上传一个excel文件并在服务器中处理它。我正在使用Apache POI库来解析excel文件。我正在使用以下代码 -

XSSFWorkBook workBook = new XSSFWorkBook(multiPartFile.getInputStream());

服务器堆大小设置为2gb。如果excel文件的大小很小(例如 - 250 Kb),那么没有问题,但是对于负载测试我尝试使用12 Mb excel文件,但它因OutOfMemory错误而失败。

我开始知道从InputStream创建工作簿确实是一个需要内存的操作。那么有没有更好的方法从InputStream构建XSSFWorkBook?

2 个答案:

答案 0 :(得分:2)

XSSFWorkbook可能会耗费相当多的内存"设计"因为它提供对所有工作表/行/单元格的完全随机访问。

有一些方法可以使用更可预测的内存使用量,因此它们可以提供更少的功能或需要更多的工作。

查看使用流式XLSX解析器读取信息的示例XLSX2CSV,因此即使对于非常大的文档也会以非常低的内存开销运行。

在编写大文件方面,Apache POI提供SXSSFWorkbook,允许编写大量电子表格而无需大量内存。

答案 1 :(得分:0)

不确定OP是否可以,但将流写入(temp)文件并从该文件创建工作簿将会减少内存需求。 引自poi 3.9 javadoc,org.apache.poi.openxml4j.opc.OPCPackage.open(InputStream):

  

打开包裹。注意 - 使用比open(String)更多的内存,它不需要将整个zip文件保存在内存中,并且可以利用本机方法

但是,请注意https://bz.apache.org/bugzilla/show_bug.cgi?id=56537,如果您正沿着这条路走下去。

相关问题