Python的shelve模块是否使用内存映射IO?
有没有人知道Python的shelve
模块是否使用内存映射输入输出(IO)?
也许这个问题有点误导。我知道shelve
是依赖一个底层的dbm风格模块来完成它的工作。那么,这个底层模块使用mmap
的可能性有多大呢?
我正在做一个数据存储的原型,虽然我知道过早优化通常是不被提倡的,但这真的可以帮助我理解我的设计中涉及的权衡。
2 个回答
3
我不太明白你问这个问题是想学什么,因为你似乎已经知道答案了:这要看你用的具体数据库存储类型。有些会使用mmap(内存映射),我觉得除了dumbdbm以外的所有都应该会用mmap,但这又有什么关系呢?在shelve这个模块里,主要的开销几乎肯定不是在mmap和文件输入输出之间的选择,而是在序列化操作上。无论如何,你自己也不能合理地使用mmap来处理dbm文件,因为dbm模块可能有自己复杂的锁定机制(而且它可能根本不是一个单一的文件,比如使用bsddb的时候)。
如果你只是想为自己的数据存储寻找灵感,那就别看shelve了,因为它的作用只是把数据序列化后传递给另一个数据存储。
4
在Python的标准库中,现有的dbm
实现都是使用“正常”的输入输出方式,而不是内存映射。你需要自己编写一个使用内存映射的dbm
类似的实现,并将其与shelve
结合起来(可以直接结合,或者更有效地通过anydbm
来结合)。