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 в пакетном режиме, вы хотите, чтобы некоторые объекты кэшировались, чтобы вам не приходилось перезагружать промежуточные объекты снова и снова.