为什么将python的shelve转换为dict会占用这么多内存?

2024-09-29 01:28:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的python shelve对象(磁盘上有6GB)。我想把它移到另一台机器上,由于架子不便于携带,所以我想把它打包。要做到这一点,我首先要把它转换成dict

由于某些原因,当我做dict(myShelf)时,ipython进程的内存最高可达32GB(我的机器拥有所有内存),然后似乎挂起(或者可能需要很长时间)。在

有人能解释一下吗?或者提供一个潜在的解决办法?在

编辑:使用Python2.7


Tags: 对象内存机器编辑进程ipython原因dict
1条回答
网友
1楼 · 发布于 2024-09-29 01:28:13

根据我的经验,我认为酸洗比你目前所做的更像是一个记忆狂。但是,创建一个dict会同时将工具架中的每个键和值加载到内存中,而且您不应该因为shelf在磁盘上有6GB而假定它在内存中只有6GB。例如:

>>> import sys, pickle
>>> sys.getsizeof(1)
24
>>> len(pickle.dumps(1))
4
>>> len(pickle.dumps(1, -1))
5

因此,一个非常小的整数是Python int对象(在我的机器上)的5-6倍。在

至于解决方法:您可以将多个pickle对象写入一个文件。因此,不要将shelf转换为dict,只需在文件中写入一个长序列的键和值,然后在另一端读取同样长的键和值序列以放入新的shelf中。这样,一次只需要在内存中有一个键/值对。像这样:

写下:

^{pr2}$

阅读:

with open('myshelf.pkl', 'rb') as infile:
    for _ in xrange(pickle.load(infile)):
        k, v = pickle.load(infile)
        myShelf[k] = v

我认为您实际上不需要存储长度,您可以继续读取,直到pickle.load抛出一个异常,表明它的文件已用完。在

相关问题 更多 >