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

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

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

15287 次点击
所在节点    Python
60 条回复
opengps
2018-06-05 11:45:46 +08:00
要不你试试用工具把内存映射成硬盘,然后当作硬盘读写?
不过貌似没有长期免费的内存映射硬盘工具
purebluesong
2018-06-05 12:17:48 +08:00
怎么写的怎么读吧,python 的 loads 会在内存中占用成 10 倍磁盘空间的大小。
不过如果 Expected object or value 的话应该这个文件本身就有问题了,说不定因为文件大小限制而被截断了
Luckyray
2018-06-05 12:18:41 +08:00
这么大还用 json 不太合适吧……
likuku
2018-06-05 12:20:27 +08:00
某些数据库已经支持 Json 数据类型了,先塞进去,Py 再去读 DB 呢?
zynlp
2018-06-05 12:20:48 +08:00
加内存,就是这么直接
janxin
2018-06-05 12:21:33 +08:00
才 4 个 G 不会爆内存的吧...你内存不够了?
ho121
2018-06-05 12:25:21 +08:00
自己写个 json 解释器,支持流式读取
twor2
2018-06-05 12:25:23 +08:00
开一个临时的大内存云服务器
lesteryu
2018-06-05 12:31:19 +08:00
pip install ijson
Bramblex2
2018-06-05 12:38:59 +08:00
你这 json 什么结构啊…如果层数深还是长度长?
maxco292
2018-06-05 13:11:53 +08:00
iwtbauh
2018-06-05 13:36:02 +08:00
@opengps Linux 自带 mount -t tmpfs 了解一下,内存文件系统,比内存盘还要高效
shilyx
2018-06-05 13:36:52 +08:00
将你的需求映射为数据接口由 c++来处理,C++用 rapidjson 来读取

rapidjson 如果还是不行,就用 c++写一个针对文件的、有限功能的 json 库

如果自己搞不定,就外包
iwtbauh
2018-06-05 13:37:34 +08:00
使用 64 位处理器,64 位操作系统和 64 位 Python 尝试

从理论上讲,64 位进程的虚拟内存可以高达 EB 级别( 32 位进程的虚拟内存通常只有 2GB 或 3GB,不可能超过 4GB )
scriptB0y
2018-06-05 13:41:56 +08:00
建议使用 less 这种文本阅读工具看一下内容,然后根据内容用代码一部分一部分的读然后切成小文件,应该是比较快的方法。
lihongjie0209
2018-06-05 13:57:00 +08:00
为什么不先导入到数据库
graysheeep
2018-06-05 14:05:39 +08:00
搞策略交易么
est
2018-06-05 14:07:16 +08:00
#9 楼 @lesteryu 回复正解。迭代式解析 json 即可。内存绝对不会爆炸。
RicardoScofileld
2018-06-05 14:23:07 +08:00
@opengps 没接触过这种工具,推荐一个谢谢啦
RicardoScofileld
2018-06-05 14:24:38 +08:00
@purebluesong 你说为啥 load 的时候,会达到文件本身 10 倍的内存占用呢,是因为 Python 的数据类型导致的吗

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

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

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

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

© 2021 V2EX