我正在测试来自dbm模块的 gdbm 数据库。有两种子模式可以打开f
,s
. 我最感兴趣的是快速模式(f)将所有数据保存在内存中
f
, 以快速模式打开数据库。不会同步对数据库的写入。
并发现 python 以某种方式刷新磁盘上的数据。
我已经尝试过s
mode 并没有发现与f
.
我做了什么:
python 3.8.7
GDBM 版本 1.14.1
- 运行文件事件监控
inotifywait -m --format '%e => %w%f' -e close -e open -e create -e delete -e modify new.gdbm
- 打开的数据库
- 添加数据一条记录
- 在循环中添加了许多记录
- 被调用
sync()
- 被调用
close()
我得到的s
模式:
In [1]: import dbm.gnu
In [2]: db=dbm.gnu.open('new.gdbm', 'cs')
In [3]: db['k1']='data'
In [4]: for i in range(10):
...: db[f'{i}'] = 'data'
...:
In [5]: db.sync()
In [6]: db.close()
# all inotify events
# OPEN => new.gdbm
# CLOSE_WRITE,CLOSE => new.gdbm
并使用f
模式:
In [1]: import dbm.gnu
In [2]: db=dbm.gnu.open('new.gdbm', 'cf')
In [3]: db['k2']='data'
In [4]: for i in range(200):
...: db[f'f{i}'] = 'data'
...:
In [5]: db.sync()
In [6]: db.close()
# inotify events
# OPEN => new.gdbm
# MODIFY => new.gdbm
# MODIFY => new.gdbm
# MODIFY => new.gdbm
# MODIFY => new.gdbm
# MODIFY => new.gdbm
# MODIFY => new.gdbm
# CLOSE_WRITE,CLOSE => new.gdbm
观察:
当 python 必须同步每个修改(s 模式)时,它不会这样做。当它必须将数据保存在内存中时,它只会进行同步。同步调用不起作用,close()
在这两种情况下调用后数据都会刷新到磁盘上。
如何让事情变得正确?我需要将所有数据保存在内存中,并且在关闭数据库对象时甚至不将其刷新到磁盘上。