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 = 1024 m

我得到错误

致命错误:Allowed memory size of 1073741824 bytes exhausted (tried .在…

中分配256字节

如果我将内存限制增加到2056,我得到错误

致命错误:内存不足(已分配1919680512)(尝试分配)

如果我把它改成-1,结果也是一样的。

那么我如何加载这个csv文件没有内存问题?

谢谢

不是将整个文件放入变量中,而是解析它的换行符,然后对每个数组元素执行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对象的大小,因为它将很难遵循。

你可以逐行阅读你的文件。

例如,

$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);

但是如果你有很多数据而你的数组太大的话,仍然会出现内存问题

答案很简单,您需要在php.ini中增加memory_limit,因为文件有603MB,但是在代码中使用所有这些函数会从json数据中创建一些内存结构,这超过603MB。或者,您可以通过更改代码来优化内存使用,但您的问题是如何增加内存限制。

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

另外,新行不一定意味着CSV行的结束,explode("'n", $csv)可能会给你一些不想要的结果…使用fgetcsv()

会更安全。