Я хочу использовать 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 байт).Есть идеи почему?