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_conn это единственное соединение db, Я проверяю, что оба его целевых параметра размера кэша установлены, проверяя 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 байт). Есть идеи почему?

1 ответ

Решение

Кеш и дерево объектов ZODB - это одно и то же. Когда вы извлекаете объекты, они живут в кеше. Если ZODB постоянно применяет размер кэша, вы не сможете загружать объекты с вашими настройками.

Если вы хотите, чтобы ZODB чаще удалял объекты из кэша, рассмотрите возможность чаще совершать транзакции. Обратите внимание, что если вы загружаете объекты из BTree в пакетном режиме, вы хотите, чтобы некоторые объекты кэшировались, чтобы вам не приходилось перезагружать промежуточные объекты снова и снова.

Другие вопросы по тегам