PHP - 如何附加到JSON文件

时间:2016-10-08 00:34:57

标签: php json memory

我生成了加载到数据表中的JSON文件,这些JSON文件可以包含数据库中的数千行。要生成它们,我需要循环遍历数据库中的每一行,并将每个数据库行添加为JSON文件中的新行。我遇到的问题是:

  

致命错误:允许的内存大小为134217728字节耗尽(尝试分配262643字节)

我正在做的是我使用file_get_contents($ json_file)获取JSON文件并将其解码为数组然后我向数组添加一个新行,然后将数组编码回JSON并将其导出到文件中file_put_contents($ json_file)。

有更好的方法吗?有没有办法可以防止每次循环迭代时内存增加?或者有没有办法在达到极限之前清除内存?我需要脚本运行完成,但有了这个内存问题,它在崩溃之前几乎不会达到5%完成。

我可以继续重新运行脚本,每次重新运行它时,它会向JSON文件添加更多行,所以如果这个内存问题不可避免,有没有办法自动重新运行脚本多次直到完成?例如,我可以检测内存使用情况,并检测它何时达到限制,然后退出脚本并重新启动它?我正在使用wpengine,所以他们不会允许安全风险的函数,比如exec()。

2 个答案:

答案 0 :(得分:0)

正如我在评论中所说,我会使用CSV文件。它们有几个优点。

  • 您可以一次读/写一行,这样您只管理一行的内存
  • 您只需将新数据附加到文件中即可。
  • PHP使用string narrow_string("A string"); wstring wide_string = wstring(narrow_string.begin(), narrow_string.end()); const wchar_t* result = wide_string.c_str(); 或SPL文件对象提供大量内置支持。
  • 您可以使用“Load Data Infile”
  • 将它们直接加载到数据库中

http://dev.mysql.com/doc/refman/5.7/en/load-data.html

唯一的缺点是

  • 在整个文件中保留相同的架构
  • 没有嵌套数据结构

Json的问题是(据我所知)你必须将整个内存保存在单个数据集中。因此,您无法像普通文本文件那样流式传输(行换行)。除了限制json数据的大小之外,实际上没有解决方案,这可能甚至可能不容易。您可以增加一些内存,但如果您希望数据继续增长,这只是一个临时修复。

我们在生产环境中使用CSV文件,并且我经常处理800k或1M行的数据集。我甚至看过一个10M行。我们有一个包含60M行(MySql)的表,它是从CSV上传中填充的。所以它会起作用并且很健壮。

如果你在Json上设置,那么我会想出一些固定数量的行,它们可以设计你的代码,一次只运行那么多行。如果没有更多细节,我无法猜测如何做到这一点。

答案 1 :(得分:0)

所以我切换到使用CSV文件,它解决了内存问题。脚本运行速度也快得多。 JQuery DataTables没有内置的CSV文件支持,因此我编写了一个将CSV文件转换为JSON的函数:

Hello world

因此,结果是我创建一个CSV文件和一个JSON文件比单独创建一个JSON文件快得多,并且内存限制没有问题。