PHP spout读/写速度

时间:2016-09-02 08:47:41

标签: php excel phpexcel

我正在使用spout库在PHP中读取和编写excel文件。我只对速度有疑问。

当我尝试读/写100k记录时,它只用了15分钟 当我尝试读/写200k记录时,现在需要1.5小时

我尝试过夜上传60万条记录,花了9个小时。

我不知道这是我的机器还是什么。但它不仅增加了双倍的生成时间。

有关加快速度的提示吗?

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

Spout将数据写入电子表格所花费的时间应与数据集的大小或多或少成比例。阅读电子表格虽然不同。有3种可能的选择:

  • 您的电子表格使用内联字符串而不是共享字符串:阅读时间应与数据集大小成比例。
  • 您的电子表格使用共享字符串:
    • 共享字符串的数量有限且可以适合内存:读取时间应与数据集大小成比例。
    • 共享字符串太多,无法容纳在内存中:Spout会将共享字符串拆分为适合内存的块。每个块都保存到磁盘,只有包含正在读取的字符串的块加载到内存中。

使用2个第一选项,一切都很好,Spout尽可能快。虽然有第三种选择,但事情需要更长的时间。这是避免内存不足的问题...... 如果电子表格使用或多或少有序的共享字符串(A1使用字符串1,B1使用字符串2 ... Z10使用字符串840),则执行命中率不会那么差(它会添加一些IO操作来读取数据)来自磁盘)。但是如果共享字符串不是(A1使用字符串1但B1使用字符串200,000 - 存储在另一个块中 - 并且C1使用字符串3),因为Spout按顺序读取单元格,它将不得不执行更多IO操作来加载正确的记忆中的大块。

回到您的问题,您可以了解如何在描述电子表格的XML文件中定义数据。如果您使用Spout创建电子表格,请确保使用内联字符串(最终文件大小会更大但读取速度会更快)。

您可以执行的其他操作是修改此文件:CachingStrategyFactory.php。如果您知道所有字符都是1个字节的字符,那么您将能够将可以放入内存的字符串数量增加4(因为Spout假设4个字节的字符用于计算)。

希望有所帮助!