ZODB игнорирует количество целевых кэшированных объектов и размер целевой кеш-памяти - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу использовать 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))

Типичный вывод, производимый вышеуказанными строкамиis (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 Ответ

0 голосов
/ 15 декабря 2018

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

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

...