我注意到使用ApachePOIV3.10为xlsx文件创建工作簿语句,例如
Workbook wb = WorkbookFactory.create(inputStream)
或
Workbook wb = new XSSFWorkbook(inputStream)
...is耗时很长(~30秒),文件只有72行,10列(365 10)。
这不是问题,但似乎有点过火了。我在想我是做错了什么还是没做我该做的事。用相同的数据(但只有25 an )实例化xls文件只需1或2秒。如果这是正常的话,能不能让我知道。
编辑:
这是我使用的工作簿创建代码:
LOG.info("Loading Excel Workbook...");
Workbook workbook;
try {
workbook = WorkbookFactory.create(dataStream);
} catch (InvalidFormatException e) {
throw new IOException("Invalid file format ==> " + e.getMessage());
}
LOG.info("Workbook loaded.");
明确一点,dataStream
是一个InputStream
。30秒延迟发生在第一和第二日志语句之间。正如我之前说过的,我尝试用new XSSFWorkbook(dataStream)
替换工厂,但是延迟仍然存在。
编辑-2
我运行了一个独立测试,除了使用1)一个File
进行工作簿初始化之外什么也不做,还有一个InputStream
,它的源代码是我遇到问题的xlsx文件。他们都在大约2秒内完成了。
我应该早点加些背景的。我在使用谷歌应用引擎。我提供给POI的输入流是从上传到服务器的文件中检索的。Apache不支持Servlet3.0(用于处理文件上传),因此我必须使用检索文件数据。最终,我得到的数据是从InputStream
检索的FileItemStream#openStream()。这就是我提供给战俘的东西。
所以,我不知道这是否是App的问题,或者POI不喜欢InputStream返回的FileItemStream
风格。顺便说一句,我不能尝试使用File
而不是InputStream
进行初始化,因为App不允许写入文件系统。
发布于 2017-07-13 12:49:37
我会用一个可用的分析工具做一些分析,例如JVisualVM,Dynatrace,JProfiler,。
只有这样,您才能确切地知道代码中的时间是在哪里度过的,毕竟,这可能是一个意想不到的地方,您会在这里追逐错误的马。
也就是说,您可能从其他地方接收到InputStream,它可能实际上是通过互联网从某些外部内容下载的,而且它的速度可能很慢,因此所有的阅读都需要很长时间。或者可能是磁盘设置或内存短缺,其中许多GC正在运行,因为您已接近极限,.
另一种选择是提取尽可能小的代码片段,以复制此代码段,然后您可以看到需要删除哪些内容才能使其运行得更快。
发布于 2017-07-13 02:31:57
使用csv格式代替。我们在使用POI库时遇到了同样的问题,我们现在正在下载csv文件,而不是excel文件,该文件非常轻巧,下载速度很快。
https://stackoverflow.com/questions/23330156
复制相似问题