Как заставить python игнорировать объект для сборки мусора? - PullRequest
2 голосов
/ 03 октября 2019

В начале моего кода я загружаю огромный (33ГБ) засоленный объект. По сути, этот объект представляет собой огромный граф со многими взаимосвязанными узлами.

Периодически я запускаю gc.collect (). Когда я загружаю огромный объект, это занимает 100 секунд. Когда я изменяю свой код, чтобы он не загружался в огромный объект, gc.collect () занимает 0,5 секунды. Я предполагаю, что это вызвано тем, что python проверяет каждый подобъект этого объекта на предмет циклов ссылок каждый раз, когда я вызываю gc.collect ().

Я знаю, что ни огромный объект, ни какой-либо из объектовон ссылается, когда он загружается в начале, когда-либо нужно будет собирать мусор. Как мне сказать Python об этом, чтобы я мог избежать времени 100 с gc?

1 Ответ

3 голосов
/ 03 октября 2019

В Python 3.7 вы можете взломать что-нибудь, используя https://docs.python.org/3/library/gc.html#gc.freeze

allocate_a_lot()
gc.freeze() # move all objects to a permanent generation. none will be collected
allocate_some_more()
gc.collect() # collect all non-frozen objects
gc.unfreeze() # return to sanity

Тем не менее, я думаю, что Python не предлагает инструменты для того, что вы хотите. В общем, все языки с мусором не требуют ручного управления памятью.

...