Как правильно управлять памятью с помощью ZODB?

Я прочитал несколько руководств по ZODB, но вот одна вещь, которую я до сих пор не понимаю: как освободить память, которая уже сериализована (и зафиксирована) в (скажем) FileStorage?

В частности, я хочу, чтобы следующий код перестал потреблять всю мою память:

for i in xrange(bignumber):
    iobtree[i]=Bigobject() # Bigobject is about 1Mb
    if(i%10==0): 
        transaction.commit() # or savepoint(True)
transaction.commit()

Как этого добиться? Можно ли освободить ссылки, хранящиеся в iobtree, и заменить их «слабыми ссылками», которые будут доступны по запросу?


person Tomas Kulich    schedule 19.11.2012    source источник


Ответы (1)


Создание точек сохранения и фиксация транзакции уже очищает большую часть вашей памяти.

  • Вам нужно будет проверить, какие параметры кэша ZODB установлены, и настроить их по мере необходимости. Параметр размера кэша указывает количество объектов в кэше, а не в байтах, поэтому вам придется настроить его в зависимости от размера ваших объектов.

  • Вы можете попробовать вызвать .cacheMinimize() для объекта подключения ZODB, это явно деактивирует любые немодифицированные (или уже зафиксированные) объекты в кеше.

Кроме этого, обратите внимание, что даже когда Python освобождает объекты из памяти, ОС не всегда возвращает эту освобожденную память до тех пор, пока она не понадобится для чего-то другого. Заявленное ОС использование памяти не обязательно отражает фактические требования к памяти для процесса Python.

person Martijn Pieters    schedule 19.11.2012
comment
Спасибо, это было действительно полезно. - person Tomas Kulich; 20.11.2012