我有一个包含两个JSON数组的文件;一个是保存有4个值的列名,另一个是包含10,000多个记录值的数组。
我正在使用Symfony和Propel;使用json_decode时会抛出允许的内存大小。在我的php.ini中,我已将最大大小指定为500 MB,但文件执行了10秒并引发了错误。
数据文件包含
{
"columns_map":["Name","Age","Address","State"],
"rows_map":{"1":["value1","value2","value3","value4"],
"4":["value1","value2","value3","value4"]
"6":["value1","value2","value3","value4"].......upto 10,000 and more records
}
}
在我的Symfony页面中,我有这段代码
$file = "path to the file";
$content = file_get_contents($file);
$array = json_decode($content);
我想将文件数组值存储到PHP数组和进程中,无论php.ini中设置的内存限制如何,我都想读取。
我想一次存储所有值或吐出文件并存储(例如读取前1000条记录并循环到最后,但是如何读取rows_map数组中的前1000条记录?)。
答案 0 :(得分:1)
确保您正在更新正确的php.ini(在Linux系统上通常有用于Apache,CGI和CLI的单独文件)。您可以通过在同一上下文中检查ini_get('memory_limit')
的返回值来确保您正在更新内存值。如果您正在运行Apache或某些CGI服务器,请不要忘记重新启动Web服务器。
即使是10k的物品也不应耗尽500MB的内存;如果真的如此,你可能会遇到同样的问题,试图自己解析它。读取和解析原始JSON字符串的块是不切实际的。选择一种更适合的格式,将数据插入数据库,或者将数据分块写入单独的文件并分别解析每个文件。
答案 1 :(得分:0)
是否可以单独存储文件?然后它已经容易多了。例如,以下结构:
1.json
(前1000行+列图)2.json
(第二千行+列图)另一个问题可能是推进。我发现Doctrine有类似的问题,迫使我使用普通的PDO来插入对象。 Doctrine会阻塞所有内存和cpu,而使用PDO编写的语句可以轻松处理这种卷。
另一种选择是使用CSV(我知道这是20世纪80年代)。但它应该允许你每行阅读它。
答案 2 :(得分:-3)
我通过创建一个具有编码和解码功能的新类来解决它