我有一个文件,其中包含两个JSON数组;一个是保存具有4个值的列名,另一个是包含10000+个记录值的数组。
我正在使用Symfony和Propel;在使用jsondecode时,它抛出一个已耗尽的允许内存大小。在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条?)。
确保更新了正确的php.ini(linux系统上通常有单独的文件用于Apache、CGI和CLI)。您可以通过在同一上下文中检查ini_get('memory_limit')
的返回值来确保允许更新内存值。如果您正在运行Apache或某些CGI服务器,请不要忘记重新启动您的web服务器。
即使是10k个项目也不应该耗尽500MB的内存;如果真的是这样,您可能会遇到同样的问题,试图自己解析它。读取和解析大块的原始JSON字符串是不实际的。选择一种更适合的格式,将数据插入数据库,或者将数据分块写入单独的文件并分别解析每个文件。
是否可以单独存储这些文件?那就已经容易多了。例如以下结构:
1.json
(前1000行+列映射)2.json
(第二个1000行+列映射)
另一个问题可能是推进。我在Doctrine中观察到了类似的问题,它迫使我使用普通PDO来插入对象。条令会阻塞所有的内存和cpu,而使用PDO准备好的语句可以很容易地处理这种量。
另一种选择是使用CSV(我知道这是20世纪80年代的事)。但它应该允许你每行阅读。
我通过创建一个自己的新类来解决这个问题,该类具有编码和解码功能