ballshapesdsd
V2EX  ›  问与答

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

  •  
  •   ballshapesdsd · Jan 11, 2018 · 2102 views
    This topic created in 3088 days ago, the information mentioned may be changed or developed.
    我的意思不是 json。。python 内置的字典和 set 都很灵活,速度也超级快,但是就是占内存太大,我们现在的程序要读差不多 50000000 级别的数据到一个字典里,最后用了差不多 10g 的内存,实在受不了,想问下有没有好的办法。。不要耗那么多内存。。速度稍微慢一点也可以。。

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

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

    字典太占内存,看能否使用__slots__
    Python 3.6 的 compact dict 也可以优化内存占用
    am241
        3
    am241  
       Jan 11, 2018 via Android
    h5py?
    ballshapesdsd
        4
    ballshapesdsd  
    OP
       Jan 11, 2018
    @am241 h5py 好像格式比较单一啊

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

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

    理论上没有任何方法比这个更快,你这种情况可以搞磁盘 KV 数据库(比如 leveldb 之类的)加上内存的 LRU cache。
    woscaizi
        9
    woscaizi  
       Jan 11, 2018 via iPhone
    加内存
    msg7086
        10
    msg7086  
       Jan 11, 2018
    「速度也超级快」就是因为在内存里啊。放到硬盘上了还快个毛线……
    如果打死都不想加内存的话,那就拼命开 swap 呗,正好可以体验一下比内存慢几万倍甚至可能几百万倍的存储器带来的影响。
    Kilerd
        11
    Kilerd  
       Jan 11, 2018
    你知道吗? Python 跟 Lua 很想, 很多东西都是基于 dict 的, 所以 Python3 的一大部分工作就是加快 dict 的操作
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2666 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 14:57 · PVG 22:57 · LAX 07:57 · JFK 10:57
    ♥ Do have faith in what you're doing.