【发布时间】:2016-01-17 21:37:41
【问题描述】:
我有以下代码
$file="postcodes.csv";
$csv= file_get_contents($file);
$array = array_map("str_getcsv", explode("\n", $csv));
$json = json_encode($array);
print_r($json);
postcodes.csv 大小为 603MB,因此文件很大。
在 php.ini 中,如果我有
memory_limit=1024M
我得到了错误
致命错误:允许的内存大小为 1073741824 字节已用尽(已尝试 分配 256 字节)在 ...
如果我将内存限制增加到 2056,我会收到错误
致命错误:内存不足(分配1919680512)(试图分配 36 字节)在...
如果我把它改成-1也是类似的。
那么我怎样才能在没有内存问题的情况下加载这个 csv 文件呢?
谢谢
【问题讨论】:
-
除非你真的需要一次在内存中的所有行(这很少见),我建议部分处理它们 - 最坏的情况是“读取一行,处理它,输出,重复。”
-
我同意上述观点,但为了分析这一点:PHP 是否在将每个字符转换为您的本机 CPU 字长时读取它?如果是这样,请尝试将您的
memory_limit增加到至少 4 * 或 8 * 输入文件中的字符数,具体取决于您的体系结构,并查看是否有帮助。免责声明:我还没有在 PHP 中完成文件读取。 -
第 2-4 行的基本意思是:将所有约 600 MB 的数据一次保存在内存中至少 3 次(作为字符串、作为数组、作为 JSON 字符串)。这实际上是一个很好的例子,如何不做那样的事情。对不起。 :)