
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 2020 年 1 月 30 日 via iPhone 别问 问就是加内存 |
2 fuermosi777 2020 年 1 月 30 日 我跑一个东西处理 60 多 G 的 json,用 go 自带的 json 包毫无压力 |
3 noqwerty 2020 年 1 月 30 日 via Android 知道结构的话用 jq pipe 进去可以吗 |
4 okchum LZ 我好像约莫着估计你是不是在某海外开车群 |
5 sleepm 2020 年 1 月 30 日 via Android https://viewer.dadroit.com/ 可以查看也可以导出 |
7 0bject OP |
8 Maboroshii 2020 年 1 月 30 日 via Android python ijson |
9 gabon 2020 年 1 月 30 日 via Android 跟我读:bengkui 崩溃 |
10 chinvo 2020 年 1 月 30 日 via iPhone 在本地直接读进内存,插进库里导出 SQL 然后到服务器上执行 |
11 0o0O0o0O0o 2020 年 1 月 30 日 via iPhone rapidjson 这些库有 SAX API | ||
12 prenwang 2020 年 1 月 30 日 学习 elasticsearch 的 bulk , 逐行解析, 每行一个 json 对象,不要整个文件一个对象 |
15 love 2020 年 1 月 30 日 整个结构是个 map ?这是什么逗逼设计,没法流式处理 |
17 azh7138m 2020 年 1 月 30 日 via Android 崩 beng 溃 kui stream-json 本身没有问题,一般是代码写的不对,为啥不直接给一下代码呢? |
19 Mutoo 2020 年 1 月 30 日 stream-json 边解析边写入数据库,解析完就 GC,只要不要在内存里留副本,不会有问题。 |
20 billlee 2020 年 1 月 30 日 jackson/jsoniter 有流式处理 API. |
21 qiayue PRO https://github.com/lemire/simdjson 解析速度 2.2GB/s |
22 hoyixi 2020 年 1 月 30 日 流处理应该没问题,看看是不是库的参数没调对。 此外,JSONStream 也可以试试 |
23 0bject OP @Mutoo 那可能是我没用对 我再去试试 @sinv 你是哪个司机。。。 @gabon 哈哈哈 @hammer86 这又一个司机? @azh7138m 可能是我没用对 我再去试试 @qiayue 谢谢 @0o0O0o0O0o 谢谢 @Maboroshii 谢谢 @prenwang 谢谢 多谢各位 新名词太多了 我去用 stream-json 再试试 然后我来贴代码 |
24 20015jjw 2020 年 1 月 30 日 via Android 新的 mac pro 1.5t 内存能派上用场了..? (单位不一样 |
26 eason1874 2020 年 1 月 30 日 按行读的前提是你的数据是按行存,现在显然不是。 像这种,我不知道有没有现成的轮子。如果让我处理的话,我会按块读取,比如每次读 1MB,正则提取出 JSON 格式字符串(剩下的放到下一块),然后解析。 |
28 Mutoo 2020 年 1 月 30 日 @0bject 你的问题就是尝试去读整个数组,肯定会内存不足。以下 gist 这是我改的 demo 你可以参考一下。 https://gist.github.com/mutoo/28667cfe7e9806ae4cfca9f348997f03 |
29 0bject OP |