V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ballshapesdsd
V2EX  ›  问与答

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

  •  
  •   ballshapesdsd · 2018-01-11 17:18:36 +08:00 · 1698 次点击
    这是一个创建于 2545 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的意思不是 json。。python 内置的字典和 set 都很灵活,速度也超级快,但是就是占内存太大,我们现在的程序要读差不多 50000000 级别的数据到一个字典里,最后用了差不多 10g 的内存,实在受不了,想问下有没有好的办法。。不要耗那么多内存。。速度稍微慢一点也可以。。

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

    有没有老司机有解决方案
    11 条回复    2018-01-11 19:47:54 +08:00
    ballshapesdsd
        1
    ballshapesdsd  
    OP
       2018-01-11 17:35:13 +08:00
    有没有老哥知道 python 的 dict 是怎么实现的,redis 是怎么实现的。。为什么 python 这么快
    0ZXYDDu796nVCFxq
        2
    0ZXYDDu796nVCFxq  
       2018-01-11 17:43:54 +08:00
    pickle 可以把 python 对象存储到文件

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

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

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

    理论上没有任何方法比这个更快,你这种情况可以搞磁盘 KV 数据库(比如 leveldb 之类的)加上内存的 LRU cache。
    woscaizi
        9
    woscaizi  
       2018-01-11 18:12:47 +08:00 via iPhone
    加内存
    msg7086
        10
    msg7086  
       2018-01-11 18:40:02 +08:00
    「速度也超级快」就是因为在内存里啊。放到硬盘上了还快个毛线……
    如果打死都不想加内存的话,那就拼命开 swap 呗,正好可以体验一下比内存慢几万倍甚至可能几百万倍的存储器带来的影响。
    Kilerd
        11
    Kilerd  
       2018-01-11 19:47:54 +08:00
    你知道吗? Python 跟 Lua 很想, 很多东西都是基于 dict 的, 所以 Python3 的一大部分工作就是加快 dict 的操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:46 · PVG 05:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.