有一个很大的 json 文件,要如何才能将它读到内存中呢, 4 个多 G

2018-06-05 11:40:12 +08:00
 RicardoScofileld

尝试用 pickle.loads 读到内存,直接内存溢出了,试着用 pandas.read_json()读取,但是报错,Excepted object or value 黔驴技穷,不知道该咋弄了

15059 次点击
所在节点    Python
60 条回复
RicardoScofileld
2018-06-05 14:25:39 +08:00
@Luckyray 哎,我老大写的代码,要我优化,他服务器 32 个 G 的内存,给我开了一个 8G 的,我跑代码特么的动不动就内存溢出。真的头大
RicardoScofileld
2018-06-05 14:26:17 +08:00
@zynlp 真粗暴,有没有什么免费的骚操作
RicardoScofileld
2018-06-05 14:27:01 +08:00
@janxin 文件大小虽然是 4 个 G,但是 load 的时候会造成很多倍的内存占用,也不知道为什么
RicardoScofileld
2018-06-05 14:27:44 +08:00
@ho121 大佬,可以来个示范代码或者链接吗,万分感激
RicardoScofileld
2018-06-05 14:28:48 +08:00
@twor2 公司 32G 的服务器,也会跑崩
RicardoScofileld
2018-06-05 14:29:18 +08:00
@lesteryu 查阅相关资料的时候看到这个库,我去了解一下
RicardoScofileld
2018-06-05 14:29:34 +08:00
@Bramblex2 字典,嵌套字典
RicardoScofileld
2018-06-05 14:31:32 +08:00
@lihongjie0209 这算一个临时的中间文件,所以没有保存数据库
RicardoScofileld
2018-06-05 14:36:18 +08:00
@iwtbauh Python 版本倒是 64 位的其他就不知道了
RicardoScofileld
2018-06-05 14:38:53 +08:00
@shilyx 小弟的水平看来只能 GG 了
linuxchild
2018-06-05 14:54:26 +08:00
单机 spark 试试?
USNaWen
2018-06-05 14:59:48 +08:00
rapidjson,用 SAX+流式。
https://github.com/Tencent/rapidjson
ipeony
2018-06-05 15:13:26 +08:00
导 mongodb 里
flyingghost
2018-06-05 15:47:43 +08:00
首先,先搞清楚你把数据加载到内存后打算干吗。
这坨数据就是比你内存大,和格式无关。哪怕它是再精简不过的 bin 格式,哪怕我用 c,都无法解决 8G 内存读取 800G 数据的矛盾。
唯一的出路,就是根据数据格式和需求确定解析和计算模式,部分解析,部分计算,分治然后汇总。

建议的几种读取方式:
1,SAX 了解一下,事件流驱动的 xml 解析思路,搬到 json 上毫无问题。
2,切割原 json 文件,给它补上恰当的开始、关闭符来确保结构。
3,自己实现解析器,最 low 的状态机实现起来很简单的。然后一边解析一边处理一边丢弃。
4,如果 json 数据有某种特征,预处理一下。(比如结构体其实不复杂元素也不多,但里面有个字段的值超大,那么先文本处理 json,把这个字段抽取出来形成外部文件,json 内只留个文件名索引)其实很多超大数据集要么结构简单只是数据条数多,要么条数不多但单条比较大,很容易做针对性处理。
yedashuai
2018-06-05 15:49:46 +08:00
这是使用 generator 的最佳场景呀,流式读取和解析~~~
RicardoScofileld
2018-06-05 15:56:51 +08:00
@flyingghost 这个本来是很多个文件处理后生成的一个字典,然后用 pickle dump 出去,生成一个临时中间文件,避免下次使用的时候还要经过计算生成,但是在 load 的时候,不知道为什么内存占用会成倍的增长。
RicardoScofileld
2018-06-05 15:57:26 +08:00
@yedashuai 用 pickle 生成的文件,要如何流式读取解析呢
henglinli
2018-06-05 16:28:49 +08:00
这就是典型设计问题啊
jyf
2018-06-05 16:39:07 +08:00
有流式解析的 不过这要看你的数据本身的结构 34 楼已经说得很清楚了
RedFlag2233
2018-06-05 16:48:49 +08:00
with as 😯

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

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

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

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

© 2021 V2EX