我生成了加载到数据表中的JSON文件,这些JSON文件可以包含数据库中的数千行。要生成它们,我需要循环遍历数据库中的每一行,并将每个数据库行添加为JSON文件中的新行。我遇到的问题是:
致命错误:允许的内存大小为134217728字节耗尽(尝试分配262643字节)
我正在做的是我使用file_get_contents($ json_file)获取JSON文件并将其解码为数组然后我向数组添加一个新行,然后将数组编码回JSON并将其导出到文件中file_put_contents($ json_file)。
有更好的方法吗?有没有办法可以防止每次循环迭代时内存增加?或者有没有办法在达到极限之前清除内存?我需要脚本运行完成,但有了这个内存问题,它在崩溃之前几乎不会达到5%完成。
我可以继续重新运行脚本,每次重新运行它时,它会向JSON文件添加更多行,所以如果这个内存问题不可避免,有没有办法自动重新运行脚本多次直到完成?例如,我可以检测内存使用情况,并检测它何时达到限制,然后退出脚本并重新启动它?我正在使用wpengine,所以他们不会允许安全风险的函数,比如exec()。
答案 0 :(得分:0)
正如我在评论中所说,我会使用CSV文件。它们有几个优点。
string narrow_string("A string");
wstring wide_string = wstring(narrow_string.begin(), narrow_string.end());
const wchar_t* result = wide_string.c_str();
或SPL文件对象提供大量内置支持。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文件快得多,并且内存限制没有问题。