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

db_conndb 的唯一连接。我正在通过检查 db_conn._cache.cache_size 来验证其目标缓存大小参数是否已设置和db_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))

以上几行产生的典型输出是(Simulation 是我的对象的类,继承自 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 批量加载对象,您需要缓存一些对象,这样您就不必一遍又一遍地重新加载中间对象。

关于python - ZODB 忽略目标缓存对象计数和目标缓存内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53605884/

相关文章:

python - 如何在不引起错误的情况下比较值

python - 尝试和错误除了 catch 中断?

python - Emacs 24,Rope 重命名 : "calculating rename changes", 然后变得无响应

magento - 错误magento 1.9-使用未定义的常数tmp-假定为 'tmp'

python - 从 .fs 文件导出数据。 Plone 人3.3.5

python - 将 SQLAlchemy ORM 与来自 sql 核心表达式的对象连接起来?

caching - 内层缓存可以写回包容性外层缓存吗?

magento - 如何实现购物车 block 的magento缓存打洞

python - 如何提高处理大量数据的脚本的性能?

python - 如何在Python中保存整个项目