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

2020-09-29 21:19:21 +08:00
 nuistzhou

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 来处理,但是没有经验,不知道是否可行,以及在容器上执行的效率还有内存占用问题。

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

907 次点击
所在节点    问与答
2 条回复
pabupa
2020-09-30 03:13:42 +08:00
虽然 chunk 很小,但是最终结果肯定比内存大。

所以:

1,去掉文件中的最外层包裹字符,只剩下`{key:val,...}...`
2,从文件中读取字符,直到`}`为止,然后尝试解析 buffer 。解析成功,则继续下一个 document ;解析不成功,就继续找下一个`}`,更新 buffer 。
3, 每成功解析 N 个就写一次数据库。
nuistzhou
2020-09-30 05:42:07 +08:00
@pabupa 谢谢!虽然我已经搞定了,但发现写 9 百万数据都要几个小时,太恐怖了,那我另一个 8 千万条的文件岂不是要疯了。在考虑用 spark 之类的了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX