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

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

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

15083 次点击
所在节点    Python
60 条回复
crist
2018-06-05 17:00:32 +08:00
请装 16G 的内存,谢谢。
focusheart
2018-06-05 18:05:51 +08:00
嗯,看了补充内容,标题有歧义。
标题的一般理解是有个 4G 多的 xxx.json 的纯文本文件。
而实际上是一个 pickle dump 出来的对象文件比如 xxx.pkl 。
显然用 pd.read_json() 是无法读取这个 xxx.pkl 的,也不用考虑流式之类的问题。

这样几种方法解决:
1. 如#41 所说,加内存,简单有效省事。
2. 用 json 的话,重新用 json.dump() 搞一个纯文本的 xxx.json。纯文本怎么都好办。
3. pickle 并不适合搞大对象的保存。换个库来做对象序列化,marsahl 好一些,但是要注意 python 版本。
diggerdu
2018-06-05 18:54:34 +08:00
临时加个 swapfile
aimiyooo
2018-06-05 23:28:00 +08:00
4 个 G 数据,加载到内存可远远不止 4G
exhades
2018-06-06 00:03:25 +08:00
加内存咯....不过全部加载到内存干什么.....
qwertyegg
2018-06-06 01:17:41 +08:00
NoSQL
feiffy
2018-06-06 09:07:45 +08:00
如果都是条数多,嵌套层数少,相同元素多,可以流式读取文件,generator 处理啊
RicardoScofileld
2018-06-06 09:24:16 +08:00
@jyf 额 是我的描述出了点问题,pickle.dump 是异于 json.dump 的,是一个超大的字典,dump 出去有 4 个多 G,但是 load 的时候内存占用成倍的增长,直接溢出
RicardoScofileld
2018-06-06 09:25:14 +08:00
@crist 文件达到将近 5 个 G 的时候,32G 内存服务器偶尔会崩。。。。
RicardoScofileld
2018-06-06 09:26:58 +08:00
@focusheart 是啊,我原以为这两个库作用是相同的,查阅资料的时候才发现是有区别的,误导了大家了,尴尬
RicardoScofileld
2018-06-06 09:27:23 +08:00
@diggerdu 谢谢,我去了解一下
RicardoScofileld
2018-06-06 09:29:17 +08:00
@aimiyooo 是啊,pickle dump 出去只有 4 个 G,load 进来的时候却成倍的增长,是不是因为数据结构的原因呢
RicardoScofileld
2018-06-06 09:31:28 +08:00
@exhades 是经过处理计算的一个字典,为了减少下次运算时间,所以打算用空间换取时间,dump 出一个中间临时文件,到时候直接 load 进来的
RicardoScofileld
2018-06-06 09:34:07 +08:00
@qwertyegg 如果用 nosql,我想了一下,对于 redis,貌似只能用 hash 类型,但是这个字典里面有嵌套,要保存的话,还是需要序列化
lfzyx
2018-06-06 10:16:19 +08:00
大多数应用程序都必须检索整个对象,然后仅过滤出所需数据以进行进一步分析。借助 S3 Select,应用程序可以将过滤和访问对象内部数据的繁重工作卸载到 Amazon S3 服务。

https://aws.amazon.com/cn/about-aws/whats-new/2018/04/amazon-s3-select-is-now-generally-available/?nc1=f_ls
ofooo
2018-06-06 11:06:13 +08:00
你老大 32G 内存,你就和你老大说一下不就完了吗。需求不合理就提。
liangeeks
2018-06-06 11:58:06 +08:00
这么大,知道数据结构的话慢慢读,不用一次性 load 啊
RicardoScofileld
2018-06-06 13:53:34 +08:00
@liangeeks pickle dump 出去的,怎么慢慢读呢
cctv1005s927
2018-06-06 14:48:33 +08:00
自己搞一个数据结构存放文件吧,json 的文件是有深度的,有些时候不读取完毕很难读取到一个 object 的内容。
beforeuwait
2018-06-14 17:14:36 +08:00
用 生成器呀

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

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

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

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

© 2021 V2EX