我正在研究一个cron脚本,该脚本命中API,接收JSON文件(大量对象)并将其存储在本地。完成后,另一个脚本需要解析下载的JSON文件并将每个对象插入MySQL数据库。
我目前正在使用file_get_contents()
和json_decode()
。在尝试处理之前,这将尝试将整个文件读入内存。除了我的JSON文件通常在250MB-1GB +范围内之外,这没什么问题。我知道我可以增加我的PHP内存限制,但这似乎不是我心中最好的答案。我知道我可以运行fopen()
和fgets()
来逐行读取文件,但我需要读取每个json对象的文件。
有没有办法在每个对象的文件中读取,还是有其他类似的方法?
答案 0 :(得分:7)
试试这个lib https://github.com/shevron/ext-jsonreader
PHP附带的现有ext / json非常方便 使用简单 - 但使用大型设备时效率低下 安装JSON数据,因为它需要读取整个JSON数据 进入内存(例如使用file_get_contents())然后转换它 一次进入PHP变量 - 对于大型数据集,这需要很多 记忆
JSONReader专为内存效率而设计 - 它适用于流和 可以从任何PHP流中读取JSON数据而无需加载整个数据流 数据到内存中。它还允许开发人员提取特定的 来自JSON流的值,无需解码并将所有数据加载到 存储器中。
答案 1 :(得分:5)
这实际上取决于json文件包含的内容。
如果打开文件一次进入内存不是一个选项,你唯一的另一个选择是fopen / fgets。
可以逐行读取,如果这些json对象具有一致的结构,您可以轻松检测文件中的json对象何时开始并结束。
收集整个对象后,将其插入数据库,然后转到下一个对象。
没有更多的东西。检测json对象的开始和结束的算法可能会因你的数据源而变得复杂,但我之前用更复杂的结构(xml)做了类似的事情,并且它工作正常。
答案 2 :(得分:4)
最佳解决方案:
使用某种分隔符(分页,时间戳,对象ID等),允许您在多个请求中以较小的块读取数据。此解决方案假定您可以对如何生成这些JSON文件进行某种控制。我基于我的假设:
除了我的 JSON文件通常这样的事实之外,这没什么问题 范围从250MB-1GB +。
读入和处理1GB的JSON数据简直太荒谬了。绝对需要更好的方法。