V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
UN2758
V2EX  ›  问与答

Python 如何读取超大 json 文件?

  •  
  •   UN2758 · 2018-02-07 16:52:34 +08:00 · 4085 次点击
    这是一个创建于 2512 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个 4g 多的 json 文件,格式是:
    {
    'id': 'xxxxx'
    'q' : 'xxxxx'
    'a' : 'xxxxx'
    },
    {
    'id': 'xxxxx'
    'q' : 'xxxxx'
    'a' : 'xxxxx'
    }
    这样的,用 ijson 怎么打开呢?prefix 路径因为没有顶级键,不会设置啊,然后就报错了
    16 条回复    2018-02-08 16:56:52 +08:00
    noe132
        1
    noe132  
       2018-02-07 17:32:44 +08:00
    超大文件不适合 JSON 存储。。。。
    如果是一个大数组,可以想办法优化成

    {...}
    {...}
    {...}

    的 JSON line 格式去以行去读。或者如果每个对象占用行固定也可以以固定行数去读。。
    否则你得把 4G 的文件整体解析到内存里才行。
    bazingaterry
        2
    bazingaterry  
       2018-02-07 17:38:00 +08:00 via iPhone
    已知格式可以手寫 json parser,結合業務需求一點一點讀
    wellsc
        3
    wellsc  
       2018-02-07 17:39:56 +08:00
    存到 mongo 里试试
    twor
        4
    twor  
       2018-02-07 19:08:06 +08:00
    一行一行的读,解析后,扔到数据库,或者保存成其他格式?
    huiyifyj
        5
    huiyifyj  
       2018-02-07 19:11:17 +08:00
    4G 的 Json.

    0.0!!!
    MeteorCat
        6
    MeteorCat  
       2018-02-07 20:06:05 +08:00 via Android
    吓尿了 4G 的数据,解析起来内存应该爆炸了
    Lxxyx
        7
    Lxxyx  
       2018-02-07 20:18:37 +08:00 via Android
    用 Node 处理过 3g 的 json,直接 load,v8 扛不住,后面用的是 stream 的方式,一点一点解析。(供参考)
    neocanable
        8
    neocanable  
       2018-02-07 22:33:15 +08:00
    cat yourfile.json | grep -v "{" | grep -v "}," > new_file
    新的文件格式就是:
    'id': 'xxxxx'
    'q' : 'xxxxx'
    'a' : 'xxxxx'
    'id': 'xxxxx'
    'q' : 'xxxxx'
    'a' : 'xxxxx'
    'id': 'xxxxx'
    'q' : 'xxxxx'
    'a' : 'xxxxx'


    然后一行一行的读吧,很简单
    xiaozizayang
        9
    xiaozizayang  
       2018-02-07 23:30:27 +08:00 via Android
    pandas 分段读取 或者 spark 吧
    ulala
        10
    ulala  
       2018-02-07 23:38:29 +08:00 via iPad
    曾经有类似的需求,一个好几 g 的文件,每一行一个 json 对象。写了个 C 程序一行行读入,然后抛到队列里并发用 rapidjson 去解析。速度还是挺快的。
    zc666
        11
    zc666  
       2018-02-08 00:46:15 +08:00 via iPad
    可以了解下 jq
    binux
        12
    binux  
       2018-02-08 01:44:54 +08:00
    streaming JSON parser python
    KaelSunstrider
        13
    KaelSunstrider  
       2018-02-08 01:54:41 +08:00
    一行一行 yield 出来,处理一行就继续 yield 下一行。或则使用 ubuntu 下的行切割命令分成小文件再处理
    cout2013mr
        14
    cout2013mr  
       2018-02-08 09:22:21 +08:00
    要是数组还好,可以一行行来读文件,你要是个整个大对象,key 还没有命名规则的话,真想不到什么好方法。。
    UN2758
        15
    UN2758  
    OP
       2018-02-08 12:14:11 +08:00
    谢谢大家了,倒腾来倒腾去发现 json 确实不合适储存大文件,改用 csv 了
    xwhxbg
        16
    xwhxbg  
       2018-02-08 16:56:52 +08:00
    readline,我用 js 读过 5 个多 G 的文件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:48 · PVG 11:48 · LAX 19:48 · JFK 22:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.