ZODB 忽略目标缓存对象计数和目标缓存内存大小
ZODB ignores target cached object count and target cache memory size
我想使用缓存尽可能少的 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_conn
是db
的唯一连接。我正在通过检查 db_conn._cache.cache_size
和 db_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))
上述行产生的典型输出是(模拟是我的对象的 class,继承自 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字节)。有什么想法吗?
ZODB的缓存和对象树是一回事。当您检索对象时,它们 存在 缓存中。如果 ZODB 持续强制缓存大小,您将无法使用您的设置加载对象。
如果您希望 ZODB 更频繁地从缓存中删除对象,请考虑更频繁地提交事务。请注意,如果您要从 BTree 批量加载对象,您希望缓存一些对象,这样您就不必一遍又一遍地重新加载中间对象。
我想使用缓存尽可能少的 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_conn
是db
的唯一连接。我正在通过检查 db_conn._cache.cache_size
和 db_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))
上述行产生的典型输出是(模拟是我的对象的 class,继承自 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字节)。有什么想法吗?
ZODB的缓存和对象树是一回事。当您检索对象时,它们 存在 缓存中。如果 ZODB 持续强制缓存大小,您将无法使用您的设置加载对象。
如果您希望 ZODB 更频繁地从缓存中删除对象,请考虑更频繁地提交事务。请注意,如果您要从 BTree 批量加载对象,您希望缓存一些对象,这样您就不必一遍又一遍地重新加载中间对象。