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

2024-09-30 16:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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首先不要缓存对象(而不是强制它从内存中删除缓存的对象)。你知道吗

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

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继承的myobjects类):

{'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字节)。知道为什么吗?你知道吗


Tags: 对象内存数据库cache目标dbsizestatus
1条回答
网友
1楼 · 发布于 2024-09-30 16:24:24

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

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

相关问题 更多 >