【问题标题】:Reading a 6MB csv file in PHP - Memory exhausted在 PHP 中读取 6MB 的 csv 文件 - 内存耗尽
【发布时间】:2014-04-28 16:05:35
【问题描述】:

我正在尝试使用 PHP 打开/读取一个 6MB 的 CSV 文件,如下所示:

$lines = file("/path/to/my/file.csv");

但我收到以下错误:

PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 6461150 bytes) in /path/to/php_file.php on line 488

如您所见,我们的 PHP 内存设置为 1GB(专用服务器,不受任何共享主机包等限制)。

我的问题是 6MB CSV 文件 真的在读入变量(数组)时是否应该使用超过 1GB。我只是有点困惑,因为我确定我之前用 PHP 打开过较大的 CSV 文件,在这台服务器上没有问题。

应该没什么区别,但我们在 Ubuntu 12.04 服务器上使用 PHP 5.3

【问题讨论】:

  • 这是脚本在做的唯一事情吗?您是否有理由需要内存中的完整文件?
  • 脚本之前确实做了一些事情(大到在这里发布整个事情),但这是它失败的地方。我会快速浏览一下,看看我是否能发现其他任何可能“浪费”内存的东西。我们正在遍历文件,对每一行进行一些基本处理。
  • file 行之前调用http://uk1.php.net/memory_get_usage 可能有助于追踪它。
  • 谢谢。我取消了一些在调用之前不再需要的变量,现在它工作正常 :) 根据memory_get_usage :/ 所以需要在调用之前以某种方式使用近 1GB 的内存。但它需要在足够的限制下才能工作。再次感谢!
  • stackoverflow.com/a/22744300/2037323查看我的解决方案,其中还包括一些比较

标签: php file csv memory import


【解决方案1】:

您应该逐行处理 csv 以防止内存耗尽。试试这样的:

$f = fopen("my.csv", "r");
if(true === is_resource($f))
{
    while(false === feof($f))
    {
        $line = fgetcsv($f, 8192);
        // do something with the data here
    }
    fclose($f);
}

使用 fgetcsv() 解析 csv 也比使用 file() 容易得多。

【讨论】:

    【解决方案2】:

    尝试重启apache服务器。

    【讨论】:

    • 这是一个生产服务器。除非我真的需要,否则我真的很想避免启动几百个用户。如果您可以建议任何方式来查看这是否会事先有所帮助(查看总使用内存等),那么我有兴趣研究一下。
    猜你喜欢
    • 2018-10-17
    • 2013-07-30
    • 2015-10-01
    • 1970-01-01
    • 2014-09-08
    • 2013-07-06
    • 2014-06-28
    • 2011-04-20
    相关资源
    最近更新 更多