0

我正在测试来自dbm模块的 gdbm 数据库。有两种子模式可以打开fs. 我最感兴趣的是快速模式(f)将所有数据保存在内存中

f, 以快速模式打开数据库。不会同步对数据库的写入。

并发现 python 以某种方式刷新磁盘上的数据。
我已经尝试过smode 并没有发现与f.

我做了什么
python 3.8.7
GDBM 版本 1.14.1

  1. 运行文件事件监控
    inotifywait -m --format '%e => %w%f' -e close -e open -e create -e delete -e modify new.gdbm
  2. 打开的数据库
  3. 添加数据一条记录
  4. 在循环中添加了许多记录
  5. 被调用sync()
  6. 被调用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()在这两种情况下调用后数据都会刷新到磁盘上。

如何让事情变得正确?我需要将所有数据保存在内存中,并且在关闭数据库对象时甚至不将其刷新到磁盘上。

4

0 回答 0