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

时间:2018-12-04 04:50:36

标签: 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()

db_conndb的唯一连接。我正在通过检查db_conn._cache.cache_sizedb_conn._cache.cache_size_bytes(它们的求值分别为1)来验证是否设置了两个目标缓存大小参数。

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

我正在使用cacheMinimize()cacheDetail()监视每个cacheDetailSize()调用前后的数据库缓存状态,如下所示:

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))

以上各行产生的典型输出是(模拟是我的对象的类,继承自Persistent):

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

根据我的理解,此输出显示ZODB会忽略目标缓存的对象数和目标缓存的内存大小,因为它缓存了1个以上的对象(并且肯定超过1个字节)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

ZODB的缓存和对象树是同一回事。检索对象时,它们在缓存中有效。如果ZODB连续执行高速缓存大小,则您将无法使用设置加载对象。

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