Python 的 list, dict, set 等等能存到硬盘里吗?

2018-01-11 17:18:36 +08:00
 ballshapesdsd
我的意思不是 json。。python 内置的字典和 set 都很灵活,速度也超级快,但是就是占内存太大,我们现在的程序要读差不多 50000000 级别的数据到一个字典里,最后用了差不多 10g 的内存,实在受不了,想问下有没有好的办法。。不要耗那么多内存。。速度稍微慢一点也可以。。

考虑过 redis,但是 redis 的读取性能好像有点差。。一秒只能读 5000 次左右,这样跑下来要 2,3 个小时。。

有没有老司机有解决方案
1679 次点击
所在节点    问与答
11 条回复
ballshapesdsd
2018-01-11 17:35:13 +08:00
有没有老哥知道 python 的 dict 是怎么实现的,redis 是怎么实现的。。为什么 python 这么快
0ZXYDDu796nVCFxq
2018-01-11 17:43:54 +08:00
pickle 可以把 python 对象存储到文件

字典太占内存,看能否使用__slots__
Python 3.6 的 compact dict 也可以优化内存占用
am241
2018-01-11 17:46:28 +08:00
h5py?
ballshapesdsd
2018-01-11 17:53:27 +08:00
@am241 h5py 好像格式比较单一啊

@gstqc pickle 也是必须完全读到内存里吧,我现在是想放在硬盘里读。。不过我刚发现好像硬盘速度是瓶颈而不是算法。。研究一下 compact dict,谢谢
0ZXYDDu796nVCFxq
2018-01-11 18:02:15 +08:00
丢数据库里更好啊,需要什么就取什么
查询、计算等一些功能都可以用数据库搞定

超过一定量的数据,宁愿用 sqlite 也不直接读文件
ballshapesdsd
2018-01-11 18:06:07 +08:00
@gstqc 我们用的 postgresql,没有 set 类型,用一个表来做 set 的话,非常慢,因为这个 set 要不断的插,不断的取。
QAPTEAWH
2018-01-11 18:06:40 +08:00
才 10g,当然是买内存了。
justfly
2018-01-11 18:11:14 +08:00
Python 的 dict 本质上就是进程内存空间的一个 hash table,访问就是直接访问进程内存,没有任何 IO 操作和系统调用,当然快。

理论上没有任何方法比这个更快,你这种情况可以搞磁盘 KV 数据库(比如 leveldb 之类的)加上内存的 LRU cache。
woscaizi
2018-01-11 18:12:47 +08:00
加内存
msg7086
2018-01-11 18:40:02 +08:00
「速度也超级快」就是因为在内存里啊。放到硬盘上了还快个毛线……
如果打死都不想加内存的话,那就拼命开 swap 呗,正好可以体验一下比内存慢几万倍甚至可能几百万倍的存储器带来的影响。
Kilerd
2018-01-11 19:47:54 +08:00
你知道吗? Python 跟 Lua 很想, 很多东西都是基于 dict 的, 所以 Python3 的一大部分工作就是加快 dict 的操作

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

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

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

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

© 2021 V2EX