【发布时间】:2016-10-08 00:34:57
【问题描述】:
我生成 JSON 文件并将其加载到数据表中,这些 JSON 文件可以包含来自我的数据库的数千行。要生成它们,我需要遍历数据库中的每一行并将每个数据库行添加为 JSON 文件中的新行。我遇到的问题是这样的:
致命错误:134217728 字节的允许内存大小已用尽(尝试分配 262643 字节)
我正在做的是我使用 file_get_contents($json_file) 获取 JSON 文件并将其解码为一个数组,然后我将一个新行添加到数组中,然后将数组编码回 JSON 并将其导出到文件file_put_contents($json_file)。
有没有更好的方法来做到这一点?有没有办法可以防止内存随着每次循环迭代而增加?或者有没有办法可以在内存达到限制之前清除它?我需要脚本运行完成,但是由于这个内存问题,它在崩溃之前几乎没有完成 5%。
我可以继续重新运行脚本,每次重新运行它都会向 JSON 文件添加更多行,所以如果这个内存问题是不可避免的,有没有办法自动多次重新运行脚本直到它完成?例如,我可以检测内存使用情况,并检测它何时即将达到限制,然后退出脚本并重新启动它吗?我在 wpengine 上,所以他们不会允许像 exec() 这样的安全风险函数。
【问题讨论】:
-
嗯,第一个要回答的问题是什么导致内存、数据库、文件大小、数组大小等耗尽。您只使用 128M 就可以相当安全地提高到 512M 左右服务器。但这可能是一个短期的解决方案,具体取决于真正的问题是什么。
-
问题中不清楚文件是一个大的Json数组,还是一个文件中有多个json数组。我假设是因为
file_put_contents? -
json 的问题是你必须在内存中有完整的对象,如果你可以使用 CSV,你就不会遇到这样的问题,你甚至可以在不读取内容的情况下追加行,但它会仅当您没有嵌套数据并且每一行(标题)都具有相同的架构时才有效。 CSV 文件可以一次读取和写入一行,您可以提高操作系统对文件大小的整数限制。我个人做过超过 1000 万行的文件。如果你不知道它们是什么,它只是一个逗号分隔的列表,带有标题行。