2024-09-29 01:28:13 发布
网友
我有一个非常大的python shelve对象(磁盘上有6GB)。我想把它移到另一台机器上,由于架子不便于携带,所以我想把它打包。要做到这一点,我首先要把它转换成dict
由于某些原因,当我做dict(myShelf)时,ipython进程的内存最高可达32GB(我的机器拥有所有内存),然后似乎挂起(或者可能需要很长时间)。在
dict(myShelf)
有人能解释一下吗?或者提供一个潜在的解决办法?在
编辑:使用Python2.7
根据我的经验,我认为酸洗比你目前所做的更像是一个记忆狂。但是,创建一个dict会同时将工具架中的每个键和值加载到内存中,而且您不应该因为shelf在磁盘上有6GB而假定它在内存中只有6GB。例如:
dict
>>> import sys, pickle >>> sys.getsizeof(1) 24 >>> len(pickle.dumps(1)) 4 >>> len(pickle.dumps(1, -1)) 5
因此,一个非常小的整数是Python int对象(在我的机器上)的5-6倍。在
int
至于解决方法:您可以将多个pickle对象写入一个文件。因此,不要将shelf转换为dict,只需在文件中写入一个长序列的键和值,然后在另一端读取同样长的键和值序列以放入新的shelf中。这样,一次只需要在内存中有一个键/值对。像这样:
写下:
阅读:
with open('myshelf.pkl', 'rb') as infile: for _ in xrange(pickle.load(infile)): k, v = pickle.load(infile) myShelf[k] = v
我认为您实际上不需要存储长度,您可以继续读取,直到pickle.load抛出一个异常,表明它的文件已用完。在
pickle.load
根据我的经验,我认为酸洗比你目前所做的更像是一个记忆狂。但是,创建一个
dict
会同时将工具架中的每个键和值加载到内存中,而且您不应该因为shelf在磁盘上有6GB而假定它在内存中只有6GB。例如:因此,一个非常小的整数是Python
int
对象(在我的机器上)的5-6倍。在至于解决方法:您可以将多个pickle对象写入一个文件。因此,不要将shelf转换为
dict
,只需在文件中写入一个长序列的键和值,然后在另一端读取同样长的键和值序列以放入新的shelf中。这样,一次只需要在内存中有一个键/值对。像这样:写下:
^{pr2}$阅读:
我认为您实际上不需要存储长度,您可以继续读取,直到
pickle.load
抛出一个异常,表明它的文件已用完。在相关问题 更多 >
编程相关推荐