【问题标题】:Java - POI - performanceJava - POI - 性能
【发布时间】:2017-04-21 07:20:32
【问题描述】:

上下文:我正在使用 Apache POI 库以某种格式读取 Excel 文件。每个文件只有一张纸和一个特定的模板。我能够阅读工作表,对值执行一些操作,将它们存储为 POJO,然后使用 JAXB 实现将它们转换为 XML。

问题:我现在只读取几个 excel 文件(比如 100 个),但我想设计我的应用程序,使其可扩展足以读取大约 1000 到 10000 个文件. 你能推荐一个好的架构吗?另外,我是否应该使用多线程(比如 10 个线程的线程池)一次读取 10 张纸,或者考虑到每张纸都有单独的数据且不与任何其他纸相互关联的事实,这是一个糟糕的设计。

注意: 我不能共享任何代码 sn-ps,因为这是专有代码,尽管为了假设,我们可以假设每张工作表有 50 行,每行有 6 到 10 列,所有单元格中都有纯文本数据。 由于文件很小,我将整个文件加载到内存中,然后对其进行处理。另外,我正在使用 apache poi 代码来遍历行和列(示例如下)

XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
sheet = workbook.getSheetAt(0);
//outer for loop using 'i' to iterate all rows
    row = sheet.getRow(i);
    //inner for loop using 'j' to iterate all columns in a row
        value = row.getCell(j)
        //use 'value' as and when required
    //end inner for loop
//end outer for loop

附:这是我关于 SO 的第一个问题,因此请随时在我的问题中提出任何更改/改进建议。

感谢和问候, 席德

【问题讨论】:

  • 好吧,我们必须知道您如何准确地读取数据。您可以更改代码以模拟您读取数据的方式(专有的东西应该不是问题)
  • 由于它们没有相互关联,因此非常适合并行处理。
  • @XtremeBaumer 添加了一个 sn-p。请看看它是否有帮助。
  • 从查看代码 sn-p 我会说你在那里犯了一些错误。可悲的是,我真的不明白你的意思:the fact that each sheet has separate data that it not interlinked with any other sheet。我认为你能做的最好的就是切换到并行流来实现这一点。它可能会更快。否则尝试使用多线程
  • @XtremeBaumer 您能否详细说明“切换到并行流”的含义。

标签: java excel multithreading apache-poi


【解决方案1】:

如果您想并行处理许多事情,您可能希望在 POI 中更改为 SAX 解析,这样做我们将性能提高了几个数量级(不过,我们一开始就有相当大的文件)。

您说您正在将文件加载到内存中,为了提高性能,如果 I/O 较多,您还应该考虑使用 SSD 而不是 HDD。 (如果你不能把它全部放在 RAM 中)

线程池大小也应考虑到这一点:Number of processor core vs the size of a thread pool

您可以考虑使其成为一种更流水线的方法(取决于您的代码结构),因此您可以执行以下操作:

excelFiles.parallelStream().map(read).map(mainpulate).map(store).map(convert)

如果您在某处挤压过滤器,或者如果某些内容返回为空,您可以在惰性方法中更轻松地减少负载。

只是一些想法,YMMV。

【讨论】:

  • 感谢您的想法!但是,我正在寻找一种软件架构,如类图 n 这样在他的场景中会很好。此外,jaxb 比通过 sax 手动解析所有内容要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多