在不受内存限制的情况下导入庞大的JSON编码数组


Importing HUGE JSON-encoded arrays without hitting memory constraints

我有一个文件,其中包含两个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年代的事)。但它应该允许你每行阅读。

我通过创建一个自己的新类来解决这个问题,该类具有编码和解码功能