繁体   English   中英

PHP加载大型csv文件-内存问题

[英]PHP loading large csv file - memory issues

我有以下代码

$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文件?

谢谢

您可以逐行读取文件。

例如,

$file="postcodes.csv";
$array = array();
if (($handle = fopen($file, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $array[]=$data;
    }
    fclose($handle);
}
$json = json_encode($array);
print_r($json);

但是,如果您确实有大量数据并且阵列太大,则仍然可能发生内存问题

如果您正在阅读一个大文件,我建议您使用文件指针和fgetcsv()函数并逐行循环而不是加载整个文件。

另外,新行不一定表示CSV行的末尾, explode("\\n", $csv)可能会给您带来一些不必要的结果...使用fgetcsv()会更安全

与其将整个文件放入变量中, str_getcsv其解析为换行符,然后对每个数组元素执行str_getcsv

根据您要执行的操作,一个完整的json包含每一行的所有值,或多个json字符串,每个csv行一个。

$h = fopen("postcodes.csv",);

if ($h !== FALSE) {
    $str ='';
    while (($data = fgetcsv($handle)) !== FALSE) {

        $str .= json_encode($data); // add each json string to a string variable, save later
        // or
        $array[]=$data;     
    }
}
fclose($h);

$finalJsonString = json_encode($array);

我不建议您print_r这样大小的整个arrayjson对象,因为它很难遵循。

答案很简单,您需要在php.ini中增加memory_limit,因为文件有603MB,但是在代码中使用所有此功能会根据json数据在内存中创建一些结构,并且该结构超过603MB。 Alernativley您可以优化更改代码的内存使用量,但是您的问题是如何增加内存限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM