当前位置: 首页 > 知识库问答 >
问题:

PHPExcel:打开文件需要很长时间

羊舌志
2023-03-14

我使用PHPExcel读取各种大小的Excel电子表格,然后将单元格数据导入数据库。阅读电子表格本身工作得很好,而且非常快,但是我注意到实际加载/打开PHPExcel使用的文件的时间可能需要10-20秒(文件越大,花费的时间就越长——尤其是如果电子表格是

这是我用来在迭代之前加载文件的代码:

$filetype = PHPExcel_IOFactory::identify($file);
$objReader = PHPExcel_IOFactory::createReader($filetype);
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($file);

我能做些什么来更快地加载文件?令人沮丧的是,导入数据的最大延迟只是在最初打开文件时。

非常感谢。

共有2个答案

佴德曜
2023-03-14

事实上,有些事你可以做。大多数XML解析器的问题是它们首先将整个文档加载到内存中。对于大型文档,这需要相当多的时间。

避免这种情况的一种方法是使用允许流的解析器。因此,您只需加载所需的部分,而不是加载内存中的所有XML文件内容。这样,您几乎可以在内存中一次只有一行。这是超快速和内存效率。

如果你好奇,你可以在这里找到一个使用这种技术的库的例子:https://github.com/box/spout

沃阳曜
2023-03-14

我在Ruby和Excel库中也看到过同样的行为:打开一个大文件需要相当长的时间,而文件很大

我认为原因有两个:

1) xlsx文件是压缩的,因此必须先取消压缩

2) xlsx文件是一系列必须解析的XML文件。

#1可能是一个小的打击,但很可能与2相比相形见绌。我相信真正的罪魁祸首是XML解析。此外,XML解析器是基于DOM的解析器,因此必须解析整个XML DOM并将其加载到内存中。

我不认为你真的可以做任何事情来加速这一进程。一个大的xlsx文件包含大量必须解析并加载到内存中的XML。

 类似资料:
  • 我使用javamail通过IMAP协议从exchage帐户读取邮件。这些邮件是纯格式的,内容是XML。 几乎所有这些邮件的大小都很短(通常小于100Kb)。然而,有时我不得不处理大型邮件(大约10Mb-15Mb)。例如,昨天我收到一封13Mb大小的电子邮件。仅仅读它就花了50多分钟。这正常吗?有没有办法提高它的性能?代码是: 花费如此长时间的方法是。我做错了什么?有什么提示吗? 非常感谢,我的英语

  • 给出结果需要20多秒,而在mongo控制台中同样的查询需要不到一秒。 为什么会出现这种情况,如何减少速度差距?

  • 我有以下PHP代码在Laravel正在执行一个MySql查询: 执行此查询需要很长时间。 我对所排序的列以及其他查询的许多列都有索引。 我该怎么办? 更新: 执行的查询: 结果:

  • 问题内容: 我在重新整理模型时遇到问题。我训练了模型并使用此代码保存了模型。我不太确定这是否是正确的方法,我将不胜感激。当我尝试还原模型时会发生问题。我只需要预测,就不会再接受过培训了。从模型中恢复参数需要花费很多时间。在我仅需要预测的前提下,如何改进模型保护程序或模型恢复程序以使其快速完成。 恢复: 编辑:也许使用Google Colab的GPU训练模型,然后将其还原到我的PC上这一事实很重要。

  • 在我们的kafka broker设置中,GC平均需要20毫秒,但随机增加到1-2秒。极端情况持续9秒。这种情况的发生频率相当随机。平均每天发生15次。我尝试过使用GCEasy,但没有给出任何见解。我的内存使用率为20%,但进程仍然使用交换,尽管内存可用。感谢您对如何将其最小化的任何意见 JVM选择: GC日志:

  • 问题内容: 我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2 代码卡在 在进一步调查中,我发现Hibernate调用了class 方法。此方法尝试加载有关每个数据库对象的元数据 的代码是Postgers的JDBC驱动程序的一部分,而确实是花费时间来执行该方法的驱动程序(我加载了驱动程序源并尝试了跟踪)。但是由于这个问题在Hibernate 3.3(我之前使用过)中没有

  • 我知道要冬眠。我有一个sql语句 我尝试用createCriteria和HQL实现它。 HQL: 问题是,此HQL的执行时间延长了10倍。并执行许多不必要的查询。我尝试使用注释字符串进行转换,它有了一些改进,但仍然比createCriteria查询长5倍,此外,我无法进行此转换 <代码>列表 版本数据防御

  • 不幸的是,我不允许共享任何代码。但如果有人有任何建议,我将非常感激。