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

在容器里 Parse 大体积的 JSON 文件到 Postgres 有什么好办法吗?主要是内存占用还有效率问题。

  •  
  •   nuistzhou · 2020-09-29 21:19:21 +08:00 · 951 次点击
    这是一个创建于 1517 天前的主题,其中的信息可能已经有所发展或是发生改变。

    10+G 的 JSON 文件,大概有几千万条记录,每条记录的 fields 或多或少不太一样,现在我想把这个 json 弄到 Postgres 里,而且只想要其中的 2 个公共 fields (所有的记录都有这两个属性)。对了,容器我只给了 2G 内存,除去运行的程序,可能只剩 700MB+的空余内存了。

    现在的 2 个想法是:

    1 、用 Pandas 的 read_json()的 chunksize 来把 json 读取成流文件,然后一个 chunk 接一个 chunk 地读取到内存,然后写到数据库里。 但是我在容器里实现时,每次都是 python 进程被 kill 了,可能是内存问题,但我的 chunksize 填 10 也一样失败,10 行数据也不大呀,百思不得其解。

    2 、想用 Bash 的 jq 来处理,但是没有经验,不知道是否可行,以及在容器上执行的效率还有内存占用问题。

    不知道有没有大佬能指点一下,比如有没有更好的流处理办法,谢谢!

    2 条回复    2020-09-30 05:42:07 +08:00
    pabupa
        1
    pabupa  
       2020-09-30 03:13:42 +08:00
    虽然 chunk 很小,但是最终结果肯定比内存大。

    所以:

    1,去掉文件中的最外层包裹字符,只剩下`{key:val,...}...`
    2,从文件中读取字符,直到`}`为止,然后尝试解析 buffer 。解析成功,则继续下一个 document ;解析不成功,就继续找下一个`}`,更新 buffer 。
    3, 每成功解析 N 个就写一次数据库。
    nuistzhou
        2
    nuistzhou  
    OP
       2020-09-30 05:42:07 +08:00 via iPhone
    @pabupa 谢谢!虽然我已经搞定了,但发现写 9 百万数据都要几个小时,太恐怖了,那我另一个 8 千万条的文件岂不是要疯了。在考虑用 spark 之类的了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:13 · PVG 22:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.