Python ZODB忽略目标缓存对象计数和目标缓存内存大小

Python ZODB忽略目标缓存对象计数和目标缓存内存大小,python,caching,zodb,Python,Caching,Zodb,我希望使用ZODB时尽可能少的缓存。为此,我正在创建ZODB数据库实例并按如下方式打开它: db = DB('/home/me/example.db', cache_size=1, cache_size_bytes=1) db_conn = db.open_then_close_db_when_connection_closes() cache_status_before = {'detail': db_conn.db().cacheDetail(),

我希望使用ZODB时尽可能少的缓存。为此,我正在创建ZODB数据库实例并按如下方式打开它:

db = DB('/home/me/example.db', cache_size=1, cache_size_bytes=1)
db_conn = db.open_then_close_db_when_connection_closes()
cache_status_before = {'detail': db_conn.db().cacheDetail(),
                       'detail size': db_conn.db().cacheDetailSize()}
db_conn.cacheMinimize()
cache_status_after = {'detail': db_conn.db().cacheDetail(),
                      'detail size': db_conn.db().cacheDetailSize()}
print('{} -> {}'.format(cache_status_before, cache_status_after))
db\u conn
db
的唯一连接。我正在通过检查
db\u conn.\u cache.cache\u size
db\u conn.\u cache.cache\u size\u bytes
来验证其目标缓存大小参数是否都已设置,这两个参数的计算结果均为
1

在数据库中,我在一个OOBTree中存储了大量(可能是数十亿甚至更多)的持久对象。当我从数据库中(批量)读取它们时,我的内存使用量会增加。在每次(批处理)读取之后调用
db\u conn.cacheMinimize()
,可以防止内存使用量增长,但我希望ZODB不要首先缓存对象(而不是强制它从内存中删除缓存对象)

我使用
cacheDetail()
cacheDetailSize()
在每次调用之前和之后监控数据库缓存状态,如下所示:

db = DB('/home/me/example.db', cache_size=1, cache_size_bytes=1)
db_conn = db.open_then_close_db_when_connection_closes()
cache_status_before = {'detail': db_conn.db().cacheDetail(),
                       'detail size': db_conn.db().cacheDetailSize()}
db_conn.cacheMinimize()
cache_status_after = {'detail': db_conn.db().cacheDetail(),
                      'detail size': db_conn.db().cacheDetailSize()}
print('{} -> {}'.format(cache_status_before, cache_status_after))
上面几行生成的典型输出是(Simulation是从Persistent继承的my Object类):

{'detail':[('BTrees.OOBTree.OOBucket',62),('boolsi.simulate.Simulation',1758)],
'detail size':[{'connection':'','ngsize':933,'size':1820}]}
->
{'detail':[('BTrees.OOBTree.OOBucket',3),('boolsi.simulate.Simulation',1748)],
'detail size':[{'connection':'','ngsize':0,'size':1751}]}

根据我的理解,这个输出显示目标缓存对象计数和目标缓存内存大小都被ZODB忽略,因为它缓存了超过1个对象(并且肯定超过1个字节)。知道为什么吗?

ZODB的缓存和对象树是一样的。检索对象时,它们在缓存中处于活动状态。如果ZODB连续强制执行缓存大小,您将无法使用您的设置加载对象


如果您希望ZODB更频繁地从缓存中移除对象,请考虑更频繁地提交事务。请注意,如果您批量从BTree加载对象,您希望缓存一些对象,这样就不必反复重新加载中间对象。

为了全面起见,我只想添加一点,即目标缓存大小是在事务边界强制执行的,而不是一直执行的。ZODB Google Group的相关线程: