gpt4 book ai didi

java - 在 Apache Poi 中调用 trackAllColumnsForAutoSIizing 的内存影响是什么

转载 作者:行者123 更新时间:2023-11-30 02:36:53 24 4
gpt4 key购买 nike

使用 Apache Poi,我已将用于将数据写入 Excel 电子表格的代码从 HSSF 转换为 SXSSF,以便在写入大文件时减少内存占用。我遇到的一个问题是尝试根据数据调整列的大小

for (int 0 = 1; i < next.getMapping().size(); i++)
{
next.getSheet().autoSizeColumn(i);
}

现在无法提示我的专栏没有被跟踪

我通过先添加解决了这个问题

((SXSSFSheet)next.getSheet()).trackAllColumnsForAutoSizing();

这行代码和我在最终保存之前调用的调整大小代码

workbook.write(fos);
fos.close();
workbook.dispose();

我不太清楚的是

  1. 这对内存的影响是,它是否突然必须将所有数据读入内存,或者只是迭代查找最长的值
  2. 我只在最后执行此操作,因此它实际上考虑所有数据还是仅考虑最后的 n 行,其中 n 是最初构建 SXSSFWorkbook 时使用的值<

更新所以我查看了 SXSSFSheet 的 javadoc [ https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFSheet.html#trackAllColumnsForAutoSizing()]它说

Adjusts the column width to fit the contents.

This process can be relatively slow on large sheets, so this should normally only be called once per column, at the end of your processing. You can specify whether the content of merged cells should be considered or ignored. Default is to ignore merged cells.

Special note about SXSSF implementation: You must register the columns you wish to track with the SXSSFSheet using trackColumnForAutoSizing(int) or trackAllColumnsForAutoSizing(). This is needed because the rows needed to compute the column width may have fallen outside the random access window and been flushed to disk. Tracking columns is required even if all rows are in the random access window.

New in POI 3.14 beta 1: auto-sizes columns using cells from current and flushed rows.

它没有给出任何关于内存缓慢的警告,它还说它考虑了所有行,但我使用的是 3.15,我不认为它正在考虑所有行。我有一些列,其中数据占用的空间比第零行中的列标题少,但创建的电子表格的列宽度小于第一行中标题的宽度。

当我处理每一行并存储最宽的数据时,我可以很容易地存储数据的宽度。然而,虽然我可以使用 setColumnWidth() 我如何考虑不同的字体

最佳答案

由于 Apache POI 是开源的,您可以 read the implementation code and see how it works!

跟踪列不会对内存占用产生太大影响,因为主存储每列只有一个对象:

Map<Integer, ColumnWidthPair> maxColumnWidths = 
new HashMap<Integer, ColumnWidthPair>();

跟踪的作用是减慢行的添加速度,因为对于跟踪列中的每个单元格,POI 在将其刷新到磁盘之前必须计算出该单元格的宽度。

如果您的文件是可预测的,通常最好打开所有列的跟踪,写出前几十行,然后关闭对文件末尾的跟踪。这将使您很好地猜测宽度,而无需计算每个单元格。

但是,如果您不知道哪一行将包含每个单元格的最长值,则需要承受轻微的性能影响并跟踪整个文件中的所有列和所有行。不过,这并不比不做多做多少工作

关于java - 在 Apache Poi 中调用 trackAllColumnsForAutoSIizing 的内存影响是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42809631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com