Python的shelve模块是否使用内存映射IO?

2 投票
2 回答
942 浏览
提问于 2025-04-15 21:29

有没有人知道Python的shelve模块是否使用内存映射输入输出(IO)?

也许这个问题有点误导。我知道shelve是依赖一个底层的dbm风格模块来完成它的工作。那么,这个底层模块使用mmap的可能性有多大呢?

我正在做一个数据存储的原型,虽然我知道过早优化通常是不被提倡的,但这真的可以帮助我理解我的设计中涉及的权衡。

2 个回答

3

我不太明白你问这个问题是想学什么,因为你似乎已经知道答案了:这要看你用的具体数据库存储类型。有些会使用mmap(内存映射),我觉得除了dumbdbm以外的所有都应该会用mmap,但这又有什么关系呢?在shelve这个模块里,主要的开销几乎肯定不是在mmap和文件输入输出之间的选择,而是在序列化操作上。无论如何,你自己也不能合理地使用mmap来处理dbm文件,因为dbm模块可能有自己复杂的锁定机制(而且它可能根本不是一个单一的文件,比如使用bsddb的时候)。

如果你只是想为自己的数据存储寻找灵感,那就别看shelve了,因为它的作用只是把数据序列化后传递给另一个数据存储。

4

在Python的标准库中,现有的dbm实现都是使用“正常”的输入输出方式,而不是内存映射。你需要自己编写一个使用内存映射的dbm类似的实现,并将其与shelve结合起来(可以直接结合,或者更有效地通过anydbm来结合)。

撰写回答