Python 磁盘字典
我在运行一些动态编程的代码(试图用暴力方法来反驳科拉兹猜想 =P),用一个字典来存储我已经计算过的链的长度。显然,程序在某个时候就会耗尽内存。有没有简单的方法可以使用某种变体的dict
,当内存不够用时,它能把部分内容存到硬盘上?当然,这样会比直接在内存中的字典慢,而且可能会占用我的硬盘空间,但这也可能适用于其他一些不那么无聊的问题。
我意识到,基于磁盘的字典其实就是一个数据库,所以我用sqlite3手动实现了一个,但我做得并不聪明,每次都要逐个查找数据库里的元素……结果慢了大约300倍。
最聪明的方法是自己创建一组字典,只在内存中保留一个,然后以某种高效的方式把其他的换出来吗?
10 个回答
可以试试 shelve 这个模块;无论如何,测试一下应该很简单。不要这样做:
self.lengths = {}
而是这样做:
import shelve
self.lengths = shelve.open('lengths.shelf')
唯一需要注意的是,shelve 的键必须是字符串,所以你需要把
self.lengths[indx]
换成
self.lengths[str(indx)]
(我假设你的键只是整数,正如你在对 Charles Duffy 的帖子中的评论所说)
虽然没有内置的内存缓存,但你的操作系统可能会自动为你处理这个问题。
(其实,这不完全正确:你可以在创建时传递参数 'writeback=True'。这样做的目的是确保在 shelve 中存储列表和其他可变对象时能正确工作。但一个副作用是整个字典会被缓存到内存中。由于这给你带来了问题,所以这可能不是个好主意 :-))
第三方的 shove 模块也值得关注。它和 shelve 很像,都是一种简单的字典对象,但它可以存储到不同的地方,比如文件、SVN 和 S3。它还提供可选的压缩功能,并且是线程安全的。这是一个非常实用的模块。
from shove import Shove
mem_store = Shove()
file_store = Shove('file://mystore')
file_store['key'] = value
在硬盘上存储哈希数据通常会用到像Berkeley DB这样的工具,或者其他类似的选项。你可以在它前面加一个内存缓存,这样可以提高速度。不过我建议你先测试一下原生性能;如果操作系统已经有缓存的话,效果可能差不多。