gpt4 book ai didi

PHP spout 读/写速度

转载 作者:行者123 更新时间:2023-12-04 20:37:53 25 4
gpt4 key购买 nike

我正在使用 spout 库在 PHP 中读取和写入 excel 文件。我只是有一个关于速度的问题。

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

我尝试在一夜之间上传 60 万条记录,花了 9 个小时。

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

有什么加快速度的技巧吗?

提前致谢! :)

最佳答案

Spout 将数据写入电子表格所花费的时间应该或多或少与数据集的大小成正比。阅读电子表格是不同的。有 3 个可能的选项:

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

  • 使用前 2 个选项,一切都很好,Spout 会尽可能快地运行。但是,使用第 3 个选项,事情需要更长的时间。这是避免内存不足的问题...
    如果电子表格使用或多或少有序的共享字符串(A1 使用字符串 1,B1 使用字符串 2...Z10 使用字符串 840),则性能命中不会那么糟糕(它添加了一些 IO 操作来读取数据从磁盘)。但是如果共享字符串不是(A1 使用字符串 1,但 B1 使用字符串 200,000 - 存储在另一个 block 中 - 而 C1 使用字符串 3),因为 Spout 顺序读取单元格,它必须执行更多的 IO 操作才能加载正确的内存中的 block 。

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

    您可以做的其他事情是修改此文件: CachingStrategyFactory.php .如果您知道所有字符都是 1 字节字符,那么您可以将可以放入内存中的字符串数量增加 4(因为 Spout 假定 4 字节字符来进行计算)。

    希望有帮助!

    关于PHP spout 读/写速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39288103/

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