![](/img/trans.png)
[英]How to sort a CSV file in PHP without loading the entire file into memory?
[英]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
这样大小的整个array
或json
对象,因为它很难遵循。
答案很简单,您需要在php.ini中增加memory_limit,因为文件有603MB,但是在代码中使用所有此功能会根据json数据在内存中创建一些结构,并且该结构超过603MB。 Alernativley您可以优化更改代码的内存使用量,但是您的问题是如何增加内存限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.