如何处理一个 1.5G 的 json - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
0bject

如何处理一个 1.5G 的 json

  •  
  •   0bject 2020 年 1 月 30 日 5390 次点击
    这是一个创建于 2277 天前的主题,其中的信息可能已经有所发展或是发生改变。

    json 的数据结构是:

    { "key1": { "key2": [ { 200 多行各种结构}, { 200 多行各种结构}, { 200 多行各种结构}, ...1.5G ] } } 

    我想把数组全写进数据库, 服务器是前一阵 Oracle 1C1G 免费的...
    在我的 15 年 8g mac 上尝试过 stream-json, 结果奔溃了
    我想的最后的方法就是按行读, 可能也只能按行读了...

    第 1 条附言    2020 年 1 月 30 日

    随便在网上找了个数据

    { "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`) ); 
    第 2 条附言    2020 年 1 月 31 日

    解决了 是我的 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`); }); 
    29 条回复    2020-01-31 03:41:17 +08:00
    lichdkimba
        1
    lichdkimba  
       2020 年 1 月 30 日 via iPhone
    别问 问就是加内存
    fuermosi777
        2
    fuermosi777  
       2020 年 1 月 30 日   1
    我跑一个东西处理 60 多 G 的 json,用 go 自带的 json 包毫无压力
    noqwerty
        3
    noqwerty  
       2020 年 1 月 30 日 via Android
    知道结构的话用 jq pipe 进去可以吗
    okchum
        4
    okchum  
       2020 年 1 月 30 日   2
    LZ 我好像约莫着估计你是不是在某海外开车群
    sleepm
        5
    sleepm  
       2020 年 1 月 30 日 via Android   1
    https://viewer.dadroit.com/
    可以查看也可以导出
    0bject
        6
    0bject  
    OP
       2020 年 1 月 30 日
    @okchum 你...
    0bject
        7
    0bject  
    OP
       2020 年 1 月 30 日
    @sleepm 我在电脑里也可以查看, 我想用程序读
    @noqwerty 谢谢 我去看看
    @fuermosi777 学不动了啊 秃顶了庶
    Maboroshii
        8
    Maboroshii  
       2020 年 1 月 30 日 via Android
    python ijson
    gabon
        9
    gabon  
       2020 年 1 月 30 日 via Android   4
    跟我读:bengkui 崩溃
    chinvo
        10
    chinvo  
       2020 年 1 月 30 日 via iPhone
    在本地直接读进内存,插进库里导出 SQL 然后到服务器上执行
    0o0O0o0O0o
        11
    0o0O0o0O0o  
       2020 年 1 月 30 日 via iPhone
    rapidjson 这些库有 SAX API
    prenwang
        12
    prenwang  
       2020 年 1 月 30 日
    学习 elasticsearch 的 bulk , 逐行解析, 每行一个 json 对象,不要整个文件一个对象
    matrix67
        13
    matrix67  
       2020 年 1 月 30 日
    @gabon 233333
    sinv
        14
    sinv  
       2020 年 1 月 30 日 via Android
    @okchum #4 好像 约莫着 估计 是不是 某

    哈哈哈哈



    @0bject
    love
        15
    love  
       2020 年 1 月 30 日
    整个结构是个 map ?这是什么逗逼设计,没法流式处理
    hammer86
        16
    hammer86  
       2020 年 1 月 30 日 via iPhone
    @okchum 群号?我朋友想看看是不是同一个群
    azh7138m
        17
    azh7138m  
       2020 年 1 月 30 日 via Android
    崩 beng 溃 kui
    stream-json 本身没有问题,一般是代码写的不对,为啥不直接给一下代码呢?
    wtks1
        18
    wtks1  
       2020 年 1 月 30 日 via Android
    @love 看起来是电报群的命令行导出数据?
    Mutoo
        19
    Mutoo  
       2020 年 1 月 30 日
    stream-json 边解析边写入数据库,解析完就 GC,只要不要在内存里留副本,不会有问题。
    billlee
        20
    billlee  
       2020 年 1 月 30 日
    jackson/jsoniter 有流式处理 API.
    qiayue
        21
    qiayue  
    PRO
       2020 年 1 月 30 日
    hoyixi
        22
    hoyixi  
       2020 年 1 月 30 日
    流处理应该没问题,看看是不是库的参数没调对。

    此外,JSONStream 也可以试试
    0bject
        23
    0bject  
    OP
       2020 年 1 月 30 日
    @Mutoo 那可能是我没用对 我再去试试
    @sinv 你是哪个司机。。。
    @gabon 哈哈哈
    @hammer86 这又一个司机?
    @azh7138m 可能是我没用对 我再去试试
    @qiayue 谢谢
    @0o0O0o0O0o 谢谢
    @Maboroshii 谢谢
    @prenwang 谢谢
    多谢各位 新名词太多了 我去用 stream-json 再试试 然后我来贴代码
    20015jjw
        24
    20015jjw  
       2020 年 1 月 30 日 via Android
    新的 mac pro 1.5t 内存能派上用场了..?
    (单位不一样
    0bject
        25
    0bject  
    OP
       2020 年 1 月 30 日
    @azh7138m
    @Mutoo
    我把代码贴上了 谢谢
    eason1874
        26
    eason1874  
       2020 年 1 月 30 日
    按行读的前提是你的数据是按行存,现在显然不是。

    像这种,我不知道有没有现成的轮子。如果让我处理的话,我会按块读取,比如每次读 1MB,正则提取出 JSON 格式字符串(剩下的放到下一块),然后解析。
    0bject
        27
    0bject  
    OP
       2020 年 1 月 30 日
    @eason1874 有道理 如果我不能拿到 里面的一层 看来只能自己写了
    Mutoo
        28
    Mutoo  
       2020 年 1 月 30 日
    @0bject 你的问题就是尝试去读整个数组,肯定会内存不足。以下 gist 这是我改的 demo 你可以参考一下。
    https://gist.github.com/mutoo/28667cfe7e9806ae4cfca9f348997f03
    0bject
        29
    0bject  
    OP
       2020 年 1 月 31 日
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     951 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 115ms UTC 19:11 PVG 03:11 LAX 12:11 JFK 15:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86