gpt4 book ai didi

java - Apache POI - 缓存工作簿是重用的最佳方式吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:15 24 4
gpt4 key购买 nike

几年来,我们一直在生产中使用 Apache POI,并取得了良好的效果。当前版本为 3.11。我们只使用 HSSF(根据我们的测试,它比 XSSF 更快,而且我们可以不用 XLSX。)

我们目前在内存中保留了一个“同步工作簿运行器”的缓存映射,大约有 70 个左右。将每个 XLS 想象成一个产品,映射键告诉我们使用哪个。我们在启动时加载缓存,因此我们永远不会实时读取文件。

我们的同步运行者大致是这样的:

public class PoiProcessorSynchronized {
private Workbook workbook;
public synchronized Map<String, Object> process(Request request) {
engine.process(workbook, request); //request has input/output params
}
}

这使得性能非常好(过去 24 小时平均 112 毫秒发出 27k 个请求)有些表很慢,有些很快。我们在处理之间手动将输入重置到工作表中,以确保工作表在使用之间是干净的。

保持工作表的处理同步是为了防止计算错误。我们最初确实看到了一些计算错误,而没有控制对工作表的访问。自从我们这样做以来,它一直很稳固。

我关心的一些问题:

  1. 对于每台服务器,每个 XLS 一次只能处理一个请求。我想我们可以通过某种处理器池来解决这个问题
  2. 工作簿的内存相对较大。如果我们继续将 XLS 添加到缓存中,我们必须添加越来越多的内存。

有没有其他人试图做类似的事情?该方法目前有效,但感觉应该有更好的方法。

我们是否可以缓存 Workbook 以外的东西?或者序列化什么?

有没有人在不同步的情况下通过工作簿成功处理大量数据?如果是怎么办?

最佳答案

在库级别,Apache POI 是线程安全的。在工作簿级别(+sheet/row/cell/etc 级别),Apache POI 不是线程安全的。给定的工作簿一次只能由一个线程处理。如果您有多个线程并行工作,它们必须有自己的工作簿来处理。不支持处理同一工作簿的两个线程(包括处理同一工作簿中的不同工作表)。

总体而言,加载 .xls 文件相当快。使用 File rather than an InputStream if you can内存稍低,加载速度稍快。查看memory and performance FAQ for some guides .确保您使用的是最新版本的 Apache POI bug fixes and improvements

对于您的具体情况,对最流行的工作簿进行某种缓存可能效果很好。也许只适用于较大的流行工作簿,而小型工作簿总是按需加载。

否则,请尝试进行一些分析,看看 POI 是否在某些地方对您的某些文件做了太多工作。那么report that and work to get it fixed ,性能改进总是受到项目的欢迎!

关于java - Apache POI - 缓存工作簿是重用的最佳方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34552543/

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