我有以下代码
$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
整个array
或json
对象的大小,因为它将很难遵循。
你可以逐行阅读你的文件。
例如,$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()