首页 > 解决方案 > 从 php 中的大 json 文件中读取大数组

问题描述

我知道我的问题在互联网上有很多答案,但似乎我找不到一个好的答案,所以我会尝试解释我所拥有的并希望最好的答案,

所以我想要做的是读取一个大的 json 文件,该文件可能具有比这更复杂的结构“具有大数组的嵌套对象”,但对于简单的示例:

{
  "data": {
    "time": [
      1,
      2,
      3,
      4,
      5,
       ...
    ],
    "values": [
      1,
      2,
      3,
      4,
      6,
       ...
    ]
  }
}

这个文件可能是 200M 或更多,我正在使用file_get_contents()json_decode()从文件中读取数据,

然后我将结果放入变量中并循环遍历时间并使用当前索引获取时间值以通过索引从值数组中获取相应的值,然后将时间和值保存在数据库中,但这会占用大量 CPU 和记忆,是他们更好的方法吗?

使用更好的函数,使用更好的 json 结构,或者比 json 更好的数据格式来执行此操作

我的代码:

$data = json_decode(file_get_contents(storage_path("test/ts/ts_big_data.json")), true);
        
foreach(data["time"] as $timeIndex => timeValue) {
    saveInDataBase(timeValue, data["values"][timeIndex])
}

提前感谢您的帮助

2020 年 6 月 29 日更新:

我还有另一个更复杂的 json 结构示例

{
      "data": {
        "set_1": {
          "sub_set_1": {
            "info_1": {
              "details_1": {
                "data_1": [1,2,3,4,5,...],
                "data_2": [1,2,3,4,5,...],
                "data_3": [1,2,3,4,5,...],
                "data_4": [1,2,3,4,5,...],
                "data_5": 10254552
              },
              "details_2": [
                [1,2,3,4,5,...],
                [1,2,3,4,5,...],
                [1,2,3,4,5,...],
              ]
            },
            "info_2": {
              "details_1": {
                "data_1": {
                  "arr_1": [1,2,3,4,5,...],
                  "arr_2": [1,2,3,4,5,...]
                },
                "data_2": {
                 "arr_1": [1,2,3,4,5,...],
                  "arr_2": [1,2,3,4,5,...]
                },
                "data_5": {
                  "text": "some text"
                }
              },
              "details_2": [1,2,3,4,5,...]
            }
          }, ...
        }, ...
      }
    } 

文件大小可能约为 500MB 或更多,并且此 json 文件中的数组可能包含大约 100MB 或更多的数据。

和我的问题我怎样才能获得任何和平并以最有效的方式在这些数据的节点之间导航,不会占用太多 RAM 和 CPU,我无法逐行读取文件,因为我需要在我必须,

例如,python 是否更适合以比 php 更高效的方式处理这些大数据?

如果你能提供一个详细的答案,我认为这对每一个希望用 php 做这些大数据的人都会有很大帮助。

标签: phparraysjsonlaravel

解决方案


JSON 是一种很好的格式,并且是 XML 的更好替代方案。最后,JSON 几乎可以一对一地转换为 XML 并返回。

大文件可以变得更大,所以我们不想读取内存中的所有内容,也不想解析整个文件。我对 XXL 大小的 JSON 文件有同样的问题。

我认为问题不在于特定的编程语言,而在于格式的实现和细节。

我有3个解决方案给你:

  1. 原生 PHP 实现首选

几乎与流式 XMLReader 一样快,还有一个库https://github.com/pcrov/JsonReader。例子:

use pcrov\JsonReader\JsonReader;

$reader = new JsonReader();
$reader->open("data.json");

while ($reader->read("type")) {
    echo $reader->value(), "\n";
}
$reader->close();

该库不会将整个文件读入内存或解析所有行。它是通过 JSON 对象树的命令遍历的一步一步的。

  1. 放开格式缺点:多次转换

将文件预处理为不同的格式,如 XML 或 CSV。有非常轻量级的 nodejs 库,例如从 JSON 到 CSV 的https://www.npmjs.com/package/json2csv 。

  1. 使用一些 NoSQL DB缺点:安装和维护额外的复杂软件

例如 Redis 或 CouchDB(导入 json 文件到 couch db- )


推荐阅读