解析大型 JSON 文件

2022-08-30 22:20:47

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

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

有没有办法读取每个对象的文件,或者有另一种类似的方法?


答案 1

试试这个库 https://github.com/shevron/ext-jsonreader

PHP附带的现有ext / json非常方便且易于使用 - 但是当处理大量JSON数据时效率低下,因为它需要将整个JSON数据读取到内存中(例如使用file_get_contents()),然后立即将其转换为PHP变量 - 对于大型数据集, 这会占用大量内存。

JSONReader专为提高内存效率而设计 - 它适用于流,并且可以从任何PHP流中读取JSON数据,而无需将整个数据加载到内存中。它还允许开发人员从 JSON 流中提取特定值,而无需解码并将所有数据加载到内存中。


答案 2

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

如果一次性打开文件到内存中不是一个选项,那么您唯一的其他选择,正如您所逃避的那样,是fopen /fgets。

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

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

没有更多的东西了。根据您的数据源,检测json对象的开头和结尾的算法可能会变得复杂,但是我之前已经使用更复杂的结构(xml)做了类似的事情,并且工作正常。


推荐