【问题标题】:Running out of memory with fgetcsv on large file在大文件上使用 fgetcsv 耗尽内存
【发布时间】:2017-06-23 18:47:54
【问题描述】:

我收到以下错误: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)

此代码块中失败的行是while (($dataInputRecord = fgetcsv($inputFile, $maxRowLength, ",")) !== FALSE)

    if (($inputFile = fopen($fileName, "r")) !== FALSE) {
        while (($dataInputRecord = fgetcsv($inputFile, $maxRowLength, ",")) !== FALSE) {
            // do stuff
        }
        fclose($inputFile);
    }

整个文件为 32MB。玩弄$maxRowLength 的大小并没有帮助。我确信问题在于文件大小,因为将其截断为 8 KB 可以解决问题。我怎样才能让它不关心文件大小?

编辑:看起来我的老板误导了我关于循环中的代码应该做什么

【问题讨论】:

  • 内存永远不会是无限的,因此没有适用于任何 csv 文件大小的通用解决方案。有几种解决方法,您可以从 stackoverflow.com/questions/17520093/… 开始
  • 我不想将整个文件加载到内存中。应该在循环的多次迭代中持续存在的唯一变量应该是一个相对较小的满足特定条件的行数组和输入文件的句柄。
  • 好吧,我敢打赌(赌注很高),实际的问题就是您在// do stuff 忽略的问题 - 我们可以看看吗?跨度>
  • memory_get_usage 添加一些调用可能会帮助您理解为什么// do stuff 占用的内存比您预期的要多。

标签: php fopen fgetcsv


【解决方案1】:

试试ini_set('memory_limit', '256M');

134217728 字节 = 128 MB

【讨论】:

  • 请注意:这并不能解决问题,只能缓解症状。对于大文件,这仍然会失败,它们只是比现在大一点。
【解决方案2】:

您可以通过更改 php.ini 中的 memory_limit 来增加内存限制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多