【问题标题】:memory size exceeds in phpexcel内存大小超出phpexcel
【发布时间】:2016-08-25 10:18:56
【问题描述】:

我有一个很大的文件,我想读一下,这样我就可以填满我的 mysql 数据库。我尝试使用 PHPExcel 库,但是当我想加载我的文件时出现错误:

致命错误:允许的内存大小为 1610612736 字节已用尽(已尝试 分配 22 个字节)在 C:\Wamp\www\Classes\PHPExcel\Worksheet.php 上 第 964 行

我已经增加了php.ini 文件中memory_limit 的值,但仍然不够。我的 Excel 文件超过 60 MB(5 109 719 个单元格)。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 尝试设置内存限制 ini_set('memory_limit','2048M'); ini_set('max_execution_time', 300); //300 秒 = 5 分钟 在您读取 excel 的函数内。 function reader(){ini_set('memory_limit','2048M');ini_set('max_execution_time', 300); //write your logic here }
  • 您是否使用过任何记录在案的方法来减少大文件的内存使用量?单元缓存?分块加载?

标签: php phpexcel


【解决方案1】:

使用 PHPExcel 读取 500 万个单元格是一个棘手的问题。您可以尝试使用 Mark 提到的单元缓存或分块加载技术。看看这里的文档:https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/04-Configuration-Settings.md

我还尝试使用 PHPExcel 读取数百万个单元格,使用这些技术,但它变成了性能问题(而不是内存问题)。读取这么多细胞需要很长时间。因此,或者,您可以尝试使用 Spout:https://github.com/box/spout。读取 500 万个单元应该只需要几 MB 的内存并且需要 20 到 40 分钟。

【讨论】:

    【解决方案2】:

    如果您没有一些特殊功能,最好将文件导出为 CSV 并将其直接导入 MySQL。 500 万个单元格很多,使用 PHP 会花费很长时间。

    Importing a csv into mysql via command line

    我不是 Java 的忠实粉丝,但为此你会得到一个很好的库。

    https://poi.apache.org/

    POI 在大文件上表现良好,并且比 PHP 工作得更好。如果您无法将文件转换为 CSV 并阅读它。你应该看看POI。

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 2020-06-25
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多