解析大型JSON文件

时间:2013-03-12 22:30:30

标签: php mysql json

我正在研究一个cron脚本,该脚本命中API,接收JSON文件(大量对象)并将其存储在本地。完成后,另一个脚本需要解析下载的JSON文件并将每个对象插入MySQL数据库。

我目前正在使用file_get_contents()json_decode()。在尝试处理之前,这将尝试将整个文件读入内存。除了我的JSON文件通常在250MB-1GB +范围内之外,这没什么问题。我知道我可以增加我的PHP内存限制,但这似乎不是我心中最好的答案。我知道我可以运行fopen()fgets()来逐行读取文件,但我需要读取每个json对象的文件。

有没有办法在每个对象的文件中读取,还是有其他类似的方法?

3 个答案:

答案 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数据简直太荒谬了。绝对需要更好的方法。