json 的数据结构是:
{
"key1": {
"key2": [
{ 200 多行各种结构},
{ 200 多行各种结构},
{ 200 多行各种结构},
...1.5G
]
}
}
我想把数组全写进数据库, 服务器是前一阵 Oracle 1C1G 免费的...
在我的 15 年 8g mac 上尝试过 stream-json, 结果奔溃了
我想的最后的方法就是按行读, 可能也只能按行读了...
随便在网上找了个数据
{
"a": {
"b": [
{
"id": 301940,
"slug": "ef4f2422125f",
"nickname": "说",
"avatar_source": "asdfsd",
"total_likes_count": 28553,
"total_wordage": 1373341,
"is_following_user": false,
"ob": {
"a": 1,
"b": 2
}
},
{
"id": 3950651,
"slug": "ca5b9d6f94dc",
"nickname": "三屿",
"avatar_source": "asdf",
"total_likes_count": 3625,
"total_wordage": 169200,
"is_following_user": false
}
]
},
"total_count": 35932
}
我想用 js 来做,前面有几位仁兄说我的 stream-json 用的不对,我又回去改了改,发现还是不好用,我觉得我是哪块用的不对,我怎么才能只处理里面的 b 层数据,因为那个是数组,也是我需要的,谢谢
我的代码如下,正在找方法拿里面的 b
const { chain } = require("stream-chain");
const { streamObject } = require("stream-json/streamers/StreamObject");
const { streamArray } = require("stream-json/streamers/StreamArray");
const Pick = require("stream-json/filters/Pick");
const fs = require("fs");
const pipeline = chain([
fs.createReadStream("./small.json"),
// fs.createReadStream("./big.json"),
Pick.withParser({ filter: "a" }),
streamObject(),
// streamArray()
]);
pipeline.on("data", data => {
console.log(data);
});
pipeline.on("end", () =>
console.log(`the end`)
);
解决了 是我的 filter 用的不对, 这是下面一位哥们的代码
const { chain } = require("stream-chain");
const { streamValues } = require("stream-json/streamers/StreamValues");
const Pick = require("stream-json/filters/Pick");
const fs = require("fs");
const pipeline = chain([
fs.createReadStream("./small.json"),
Pick.withParser({ filter: /^a\.b\.\d+/ }),
streamValues()
]);
pipeline.on("data", data => {
console.log(data);
});
pipeline.on("end", () => {
console.log(`the end`);
});
1
lichdkimba Jan 30, 2020 via iPhone
别问 问就是加内存
|
2
fuermosi777 Jan 30, 2020 我跑一个东西处理 60 多 G 的 json,用 go 自带的 json 包毫无压力
|
3
noqwerty Jan 30, 2020 via Android
知道结构的话用 jq pipe 进去可以吗
|
4
okchum Jan 30, 2020 LZ 我好像约莫着估计你是不是在某海外开车群
|
5
sleepm Jan 30, 2020 via Android https://viewer.dadroit.com/
可以查看也可以导出 |
7
0bject OP |
8
Maboroshii Jan 30, 2020 via Android
python ijson
|
9
gabon Jan 30, 2020 via Android 跟我读:bengkui 崩溃
|
10
chinvo Jan 30, 2020 via iPhone
在本地直接读进内存,插进库里导出 SQL 然后到服务器上执行
|
11
0o0O0o0O0o Jan 30, 2020 via iPhone
rapidjson 这些库有 SAX API
|
12
prenwang Jan 30, 2020
学习 elasticsearch 的 bulk , 逐行解析, 每行一个 json 对象,不要整个文件一个对象
|
15
love Jan 30, 2020
整个结构是个 map ?这是什么逗逼设计,没法流式处理
|
17
azh7138m Jan 30, 2020 via Android
崩 beng 溃 kui
stream-json 本身没有问题,一般是代码写的不对,为啥不直接给一下代码呢? |
19
Mutoo Jan 30, 2020
stream-json 边解析边写入数据库,解析完就 GC,只要不要在内存里留副本,不会有问题。
|
20
billlee Jan 30, 2020
jackson/jsoniter 有流式处理 API.
|
21
qiayue PRO https://github.com/lemire/simdjson 解析速度 2.2GB/s
|
22
hoyixi Jan 30, 2020
流处理应该没问题,看看是不是库的参数没调对。
此外,JSONStream 也可以试试 |
23
0bject OP @Mutoo 那可能是我没用对 我再去试试
@sinv 你是哪个司机。。。 @gabon 哈哈哈 @hammer86 这又一个司机? @azh7138m 可能是我没用对 我再去试试 @qiayue 谢谢 @0o0O0o0O0o 谢谢 @Maboroshii 谢谢 @prenwang 谢谢 多谢各位 新名词太多了 我去用 stream-json 再试试 然后我来贴代码 |
24
20015jjw Jan 30, 2020 via Android
新的 mac pro 1.5t 内存能派上用场了..?
(单位不一样 |
26
eason1874 Jan 30, 2020
按行读的前提是你的数据是按行存,现在显然不是。
像这种,我不知道有没有现成的轮子。如果让我处理的话,我会按块读取,比如每次读 1MB,正则提取出 JSON 格式字符串(剩下的放到下一块),然后解析。 |
28
Mutoo Jan 30, 2020
@0bject 你的问题就是尝试去读整个数组,肯定会内存不足。以下 gist 这是我改的 demo 你可以参考一下。
https://gist.github.com/mutoo/28667cfe7e9806ae4cfca9f348997f03 |
29
0bject OP |