Php 解析大型JSON文件

Php 解析大型JSON文件,php,mysql,json,Php,Mysql,Json,我正在编写一个cron脚本,该脚本可以访问API,接收JSON文件(一个大的对象数组)并将其存储在本地。完成后,另一个脚本需要解析下载的JSON文件,并将每个对象插入MySQL数据库 我目前正在使用一个文件\u get\u contents()以及json\u decode()。这将尝试在处理之前将整个文件读入内存。这很好,除了我的JSON文件通常在250MB-1GB+之间。我知道我可以增加我的PHP内存限制,但这似乎不是我心目中最好的答案。我知道我可以运行fopen()和fgets()逐行读取

我正在编写一个cron脚本,该脚本可以访问API,接收JSON文件(一个大的对象数组)并将其存储在本地。完成后,另一个脚本需要解析下载的JSON文件,并将每个对象插入MySQL数据库

我目前正在使用一个
文件\u get\u contents()
以及
json\u decode()
。这将尝试在处理之前将整个文件读入内存。这很好,除了我的JSON文件通常在250MB-1GB+之间。我知道我可以增加我的PHP内存限制,但这似乎不是我心目中最好的答案。我知道我可以运行
fopen()
fgets()
逐行读取文件,但我需要按每个json对象读取文件


是否有一种方法可以读取每个对象的文件,或者有其他类似的方法?

这实际上取决于json文件包含的内容

如果一次将文件打开到内存中不是一个选项,那么您唯一的另一个选项是fopen/fgets

逐行读取是可能的,如果这些json对象具有一致的结构,则可以轻松地检测文件中的json对象何时开始、何时结束

收集整个对象后,将其插入数据库,然后继续下一个对象


没有更多的了。检测json对象开头和结尾的算法可能会变得复杂,具体取决于您的数据源,但我以前使用了更复杂的结构(xml)做过类似的工作,效果很好。

最佳解决方案:

使用某种分隔符(分页、时间戳、对象ID等),允许您在多个请求中以较小的块读取数据。此解决方案假设您可以控制这些JSON文件的生成方式。我的假设基于:

除了myJSON文件通常 范围从250MB到1GB+

读取和处理1GB的JSON数据简直是荒谬可笑。最需要更好的方法。

试试这个库

PHP附带的现有ext/json非常方便和实用 简单易用-但在使用大型计算机时效率低下 大量JSON数据,因为它需要读取整个JSON数据 进入内存(例如,使用file_get_contents()),然后将其转换 一次转换为PHP变量-对于大型数据集,这会占用很多时间 记忆

JSONReader是为提高内存效率而设计的—它可以处理流和数据流 可以从任何PHP流读取JSON数据,而无需加载整个 将数据存储到内存中。它还允许开发人员提取特定的 JSON流中的值,无需解码并将所有数据加载到 记忆


这可能会帮助你…为什么JSON文件如此之大?好悲伤!来自API调用的1gig响应??那太疯狂了。难道开发人员从未听说过分页的概念吗?没有现有的
json_decode
函数,逐行阅读并自己解析似乎是你唯一的选择。例如,可能会有类似的第三方库(从未使用过它,不能说任何关于它的事情,只是快速的google打开了它)。如果json文件是数据库转储,应该有另一种方法。结构非常基本,1个大的对象数组,每个对象具有相同的3个属性。我假设我将执行一个
fgets()
,解析单个字符串以找到其中的所有JSON对象并将它们插入数据库。然后,我会将指针重置到最后一个成功找到的JSON对象的末尾,然后重复。你是这么想的吗?没错。由于文件的大小差异很大(200mb到1gb等),因此最好采用一种不考虑文件大小的方法。