基于Python磁盘的字典

2024-04-20 11:52:49 发布

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

我在运行一些动态编程代码(试图用暴力推翻Collatz猜想=p),并使用dict存储已经计算出的链的长度。很明显,它在某个时候内存不足。有没有什么简单的方法可以使用dict的某个变体,当它用完空间时,它会将自己的一部分分页到磁盘上?很明显,它比内存中的dict要慢,而且很可能最终会占用我的硬盘空间,但这也可能适用于其他不是那么徒劳的问题。

我意识到基于磁盘的字典基本上就是一个数据库,所以我使用sqlite3手动实现了一个,但是我没有用任何聪明的方法,而是让它一次一个地查找数据库中的每个元素。。。大约慢了300倍。

最聪明的方法就是创建自己的一组dict,一次只在内存中保存一个,然后以某种高效的方式将它们分页出来?


Tags: 方法内存代码数据库编程空间动态变体
3条回答

第三方shove模块也值得一看。它与shelve非常相似,因为它是一个简单的类似dict的对象,但是它可以存储到各种后端(如file、SVN和S3),提供可选的压缩,甚至是线程安全的。这是一个非常方便的模块

from shove import Shove

mem_store = Shove()
file_store = Shove('file://mystore')

file_store['key'] = value

shelve模块可以做到这一点;无论如何,它应该易于测试。而不是:

self.lengths = {}

做:

import shelve
self.lengths = shelve.open('lengths.shelf')

唯一的问题是架子的钥匙必须是串的,所以你必须更换

self.lengths[indx]

self.lengths[str(indx)]

(根据你对查尔斯·达菲帖子的评论,我认为你的密钥只是整数)

内存中没有内置缓存,但无论如何,您的操作系统可能会为您这样做。

[实际上,这并不完全正确:您可以在创建时传递参数'writeback=true'。这样做的目的是确保在工具架中正确地存储列表和其他可变内容。但是一个副作用是整个字典都被缓存在内存中。因为这会给你带来麻烦,所以这可能不是个好主意:—)]

磁盘上的散列通常用Berkeley DB或类似的东西来处理-在Python Data Persistence documentation中列出了几个选项。你可以在它前面加一个内存缓存,但我会先测试一下本机性能;如果操作系统缓存到位,它可能也会有同样的结果。

相关问题 更多 >