Fad*_*adi 9 php arrays json laravel
我知道我的问题在互联网上有很多答案,但似乎我找不到一个好的答案,所以我将尝试解释我所拥有的并希望最好,
所以我想要做的是读取一个大的 json 文件,该文件可能具有比这更复杂的结构“具有大数组的嵌套对象”,但举个简单的例子:
{
"data": {
"time": [
1,
2,
3,
4,
5,
...
],
"values": [
1,
2,
3,
4,
6,
...
]
}
}
Run Code Online (Sandbox Code Playgroud)
这个文件可能是 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])
}
Run Code Online (Sandbox Code Playgroud)
提前感谢您的帮助
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,...]
}
}, ...
}, ...
}
}
Run Code Online (Sandbox Code Playgroud)
文件大小可能在 500MB 左右或更多,而这个 json 文件中的数组可能有大约 100MB 或更多的数据。
我的问题是如何以最有效的方式在这些数据的节点之间获得任何和平和导航,而不会占用太多 RAM 和 CPU,我无法逐行读取文件,因为我需要在以下情况下获得任何数据的和平我必须,
例如,python 是否比 php 更适合处理这些大数据?
如果您能提供详细的答案,我认为这对希望使用 php 进行大数据处理的每个人都有很大帮助。
JSON 是一种很好的格式,也是 XML 的更好替代品。最后,JSON 几乎可以一对一地转换为 XML 并返回。
大文件会变大,所以我们不想读取内存中的所有内容,也不想解析整个文件。我对 XXL 大小的 JSON 文件有同样的问题。
我认为问题不在于特定的编程语言,而在于格式的实现和细节。
我为您提供了 3 个解决方案:
几乎和流式 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();
Run Code Online (Sandbox Code Playgroud)
该库不会将整个文件读入内存或解析所有行。它是逐步遍历 JSON 对象树的命令。
将文件预处理为不同的格式,如 XML 或 CSV。有非常轻量级的 nodejs 库,如https://www.npmjs.com/package/json2csv从 JSON 到 CSV。
例如Redis或CouchDB(将json文件导入沙发db-)
您的问题基本上与您可能使用的每种特定编程语言执行的内存管理有关,以便从巨大(存储目的)文件访问数据。
例如,当您使用刚才提到的代码聚集操作时(如下所示)
$data = json_decode(file_get_contents(storage_path("test/ts/ts_big_data.json")), true);
发生的情况是,运行时 Zend 引擎使用的内存增加太多,因为它必须分配某些内存单元来存储代码语句中涉及的每个正在进行的文件处理的引用 - 就像在内存中保留一个指针,而不仅仅是真实的文件打开 - 除非该文件最终被覆盖并且内存缓冲区再次释放(释放)。毫无疑问,如果强制执行将文件读入字符串的file_get_contents()函数和json_decode()函数,则强制解释器将所有 3 个“事物”保留在内存中:文件本身、引用创建(字符串),以及结构(json 文件)。
相反,如果将语句分成几个部分,则当“获取其内容”然后将其写入另一个变量(或文件)的操作完全执行时,第一个数据结构(文件)所持有的内存堆栈将被卸载。当您没有定义保存数据的变量时,它仍然会保留在内存中(作为 blob - 没有name,没有存储地址,只有 content)。因此,在处理大数据时,CPU 和 RAM 可以更有效地以较小的步骤分解所有内容。
因此,您首先必须按如下方式重写代码:
$somefile = file_get_contents(storage_path("test/ts/ts_big_data.json"));
$data = json_decode($somefile, true);
Run Code Online (Sandbox Code Playgroud)
当第一行执行时,ts_big_data.json持有的内存将被释放(将其视为被清除并再次可供其他进程使用)。
当执行第二行时,$somefile的内存缓冲区也被释放。这样做的要点是,不是总是有 3 个内存缓冲区仅用于存储数据结构,而是每次只有 2 个内存缓冲区,当然忽略用于实际构建文件的其他内存。并不是说在使用数组(JSON 文件实际上就是数组)时,动态分配的内存会急剧增加,并且不像我们想象的那样是线性的。底线是,我们更好地设法以更小的步骤来处理“触摸”函数的执行,而不是仅在文件的存储分配上造成 50% 的性能损失(3 个大文件比其中 2 个大文件多占用 50% 的空间)。 '这些巨大的文件。
为了理解这一点,想象一下您只访问某个时刻需要的内容(这也是一个称为 YAGNI 的原则 - 你不会需要它 - 或在极限编程实践中类似 - 请参阅此处的参考资料https://wiki.c2.com/?YouArentGonnaNeedIt自 C 或 Cobol 旧时代以来继承的东西。
遵循的下一个方法是将文件分成更多部分,但采用结构化文件(关系相关数据结构),就像数据库表中一样。
显然,您必须在数据库中再次将数据块保存为 blob 。优点是在数据库中检索数据比在文件中检索数据要快得多(由于 SQL 在生成和更新表时分配索引)。具有 1 或两个索引的表可以通过结构化查询以闪电般快速的方式访问。同样,索引是指向数据主存储的指针。
然而,一个重要的主题是,如果您仍然想使用 json(数据存储的内容和类型 - 而不是数据库中的表),则您无法在不全局更改它的情况下在本地更新它。我不确定您所说的读取 json 文件中与时间相关的函数值是什么意思。你的意思是你的json文件在不断变化吗?最好将其分成几个表,这样每个单独的表都可以更改,而不会影响数据的所有巨型结构。更容易管理、更容易维护、更容易定位变更。
我的理解是,最好的解决方案是将同一个文件拆分为多个 json 文件,在其中删除不需要的值。顺便说一句,您实际上需要所有存储的数据吗?
除非您向我解释上述问题(以便我们可以进行对话),否则我现在不会提供代码,然后我将相应地编辑我的答案。我昨天写了一个与处理 blob 以及在服务器中存储相关的问题,以便使用 cron 进程加速服务器中数据更新的执行。我的数据约为 25MB+,而不是您的情况下的 500+,但我必须了解您的情况的用例。
另一件事是,您必须处理的文件是如何创建的?为什么您只管理它的最终形式而不是进一步为其提供数据进行干预?我的观点是,您可能会停止像以前那样将数据存储到其中(从而停止增加您的痛苦),而是从现在开始将其今天的用途仅转换为历史数据存储,然后将未来的数据存储在更有弹性的东西中(如MongoDB 或 NoSQL 数据库)。
也许您首先需要的不是代码,而是可靠且有用的策略和数据处理方式。
在您决定了 Web 项目的所有详细架构之后,编程才是最后的事情。
| 归档时间: |
|
| 查看次数: |
4170 次 |
| 最近记录: |