php - 从 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 做这些大数据的人都会有很大帮助。
解决方案
JSON 是一种很好的格式,并且是 XML 的更好替代方案。最后,JSON 几乎可以一对一地转换为 XML 并返回。
大文件可以变得更大,所以我们不想读取内存中的所有内容,也不想解析整个文件。我对 XXL 大小的 JSON 文件有同样的问题。
我认为问题不在于特定的编程语言,而在于格式的实现和细节。
我有3个解决方案给你:
- 原生 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 对象树的命令遍历的一步一步的。
- 放开格式(缺点:多次转换)
将文件预处理为不同的格式,如 XML 或 CSV。有非常轻量级的 nodejs 库,例如从 JSON 到 CSV 的https://www.npmjs.com/package/json2csv 。
- 使用一些 NoSQL DB(缺点:安装和维护额外的复杂软件)
例如 Redis 或 CouchDB(导入 json 文件到 couch db- )
推荐阅读
- javascript - javascript按字母顺序对包含歌曲标题的对象列表进行排序
- javascript - .addEventListener() 不适用于元素
- android - IBM Cloud 自然语言理解 API android.os.NetworkOnMainThreadException 错误
- reactjs - 道具定位时重新渲染过多,此处未使用 useEffect
- mongodb - 在 mongodb 中是否可以备份和恢复数据库中的特定集合?
- r - R:如何将嵌套列表“取消嵌套”到 data.frame 中?
- javascript - 如何使用 ng-content 将变量/成员变量从 PARENT 传递给 CHILD
- laravel - 如何在刀片模板中的两个属性数组之间动态切换
- python - Eigen 和 Numpy -> 将矩阵从 Python 传递到 C++
- javascript - 如何使用 Google Apps 脚本在 Google Drive 中移动文件夹