首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么POI需要这么多内存来处理xlsx?

为什么POI需要这么多内存来处理xlsx?
EN

Stack Overflow用户
提问于 2022-06-21 13:33:19
回答 1查看 124关注 0票数 0

我有一个大小为90 of的xlsx文件,不是很大。

首先,我使用XSSFWorkbook读取它,并得到一个OutOfMemory错误。好的,我改为使用XSSF和SAX (事件API)来读取。

当我试图编写xlsx文件时,文档https://poi.apache.org/components/spreadsheet/how-to.html#sxssf告诉"SXSSF在临时文件中刷新表数据(每个工作表一个临时文件),并且这些临时文件的大小可以增长到非常大的值。例如,对于一个20 MB的csv数据,temp的大小超过一个千兆字节。“

为什么要花这么多储藏室?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-21 15:48:34

所有2007版本及以上版本的Microsoft文件都是Office Open XML文件。这是包含XML文件和特殊目录结构中的其他嵌入式文件的ZIP档案。

内存消耗是由使用的XML格式造成的。

让我们举一个例子:

CSV:

代码语言:javascript
复制
Name, Class, Amount
Name1, Class1, 1234.56

43个角色。

最小表-XML:

代码语言:javascript
复制
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
 <dimension ref="A1"/>
 <sheetViews>
  <sheetView workbookViewId="0" tabSelected="true"/>
 </sheetViews>
 <sheetFormatPr defaultRowHeight="15.0"/>
 <sheetData>
  <row r="1">
   <c r="A1" t="inlineStr">
    <is>
     <t>Name</t>
    </is>
   </c>
   <c r="B1" t="inlineStr">
    <is>
     <t>Class</t>
    </is>
   </c>
   <c r="c1" t="inlineStr">
    <is>
     <t>Amount</t>
    </is>
   </c>
  </row>
  <row r="2">
   <c r="A2" t="inlineStr">
    <is>
     <t>Name1</t>
    </is>
   </c>
   <c r="B2" t="inlineStr">
    <is>
     <t>Class1</t>
    </is>
   </c>
   <c r="B2" t="n">
    <v>1234.56</v>
   </c>
  </row>
 </sheetData>
 <pageMargins bottom="0.75" footer="0.3" header="0.3" left="0.7" right="0.7" top="0.75"/>
</worksheet>

长度: 854个字符。

因此,使用的文本字节的数量是原来的20倍。这只是一个非常简单的例子。

每个单元格值的最小开销为56个字符:

代码语言:javascript
复制
 <c r=".." t="inlineStr">
  <is>
   <t></t>
  </is>
 </c>

与CSV数据比较。

得到的*.xlsx文件是一个ZIP文件,它使用压缩。但是,临时工作表文件在默认情况下不会被压缩以节省时间和随机访问内存。但是你所链接的资源完全声明:

SXSSF在临时文件中刷新表数据(每页一个临时文件),这些临时文件的大小可以增长到非常大的值。例如,对于20 MB的csv数据,临时xml的大小超过了千兆字节。如果临时文件的大小有问题,可以告诉SXSSF使用gzip压缩: SXSSFWorkbook wb =新的SXSSFWorkbook();wb.setCompressTempFiles(真);// temp文件将被压缩

因此,当临时文件的大小成为问题时,它提供了一个解决方案。当然,这需要时间和随机访问内存。

但是,正如我们已经说过的,使用XML作为文件格式是有代价的。

当涉及到为什么Excel使用XML然后用于*.xlsx的问题时,答案是复杂的,可能是基于意见的。

与纯文本CSV相比,CSV有一些优点。例如,可以更多地存储不同的数据类型。存储数据格式是可能的。还可以存储单元格样式和格式..。除了所有CSV永远无法存储的:图纸,图片,图表,单元格评论,.

但是对于*.xls使用的前二进制BIFF格式也是如此。因为二进制格式更接近二进制计算,所以内存使用量要少得多。

但是,所有二进制Office格式都是封闭的,Microsoft面临着发布文件格式定义的压力。XML是当时最常用的Office文件格式。例如,已经有了OpenOffice。所以..。

OpenOffice使用OpenDocument文件格式。这也是包含XML文件和特殊目录结构中的其他嵌入式文件的ZIP档案。但是内部结构和使用的XML与微软的Office Open XML不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72701730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档