【问题标题】:Blocking Apache POI While Creating XSSFWorkbook在创建 XSSFWorkbook 时阻止 Apache POI
【发布时间】:2012-06-18 15:44:22
【问题描述】:

我在 JDK 1.5 环境中使用 apache POI 3.7 和 -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=1000M 作为 JVM 参数。

我写了这样的代码来读取 xlsx 文件,

File file = new File("C:\\D\\Data Book.xlsx");
InputStream inputStream = new FileInputStream(file);
OPCPackage opcPackage = OPCPackage.open(inputStream);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

在第四行,它进入空闲状态。如果我删除 JVM 参数,它会抛出 OutOfMemoryError。我的文件大小是 6MB。

【问题讨论】:

  • 你怎么知道它处于空闲状态?是不是还在处理中?
  • 感谢您的回复,是的,它没有继续进行。一段时间后它会抛出 OutOfMemoryError。
  • 这表明a)它不是空闲的并且b)你需要在你已经指定的之上分配额外的内存。
  • 但我希望我传递给 JVM 的参数足以读取 6 MB。
  • 文件在磁盘上的大小为 6 MB,并不意味着库需要同样少量的内存来加载和处理文件。

标签: java apache-poi


【解决方案1】:

如果使用OPCPackage 不是必需的,那么我会直接实例化:

InputStream inp = new FileInputStream("C:\\D\\Data Book.xlsx");
Workbook wb = WorkbookFactory.create(inp);

POI Quick Guide

【讨论】:

【解决方案2】:

如果您有文件,则将其传入。使用 InputStream 需要将所有内容缓冲到内存中,这会占用空间。既然你不需要做缓冲,那就不要!

如果您使用 POI 的最新夜间版本运行,那么这非常容易。你的代码变成:

File file = new File("C:\\D\\Data Book.xlsx");
OPCPackage opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

不然很相似:

File file = new File("C:\\D\\Data Book.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

【讨论】:

    【解决方案3】:

    很难相信这个问题已经将近 8 年没有人回答了。 我已经对类似问题之一发布了相同的答案,让我也将其发布在这里。 而不是 XSSFWorkbook(将整个 Excel 工作簿保存在内存中)尝试使用非常高效和高性能的流式 SXSSFWorkbook 类,如下所示:

    SXSSFWorkbook workbook = new SXSSFWorkbook(100);
    

    其中 100 是将保留在内存中并实时处理的默认行数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多