Подтвердить что ты не робот

Как предотвратить утечку памяти при загрузке больших файлов pickle в цикл for?

У меня есть 50 файлов соленья, каждая по 0,5 ГБ. Каждый файл pickle состоит из списка пользовательских объектов класса. У меня нет проблем с загрузкой файлов по отдельности следующую функцию:

def loadPickle(fp):
    with open(fp, 'rb') as fh:
        listOfObj = pickle.load(fh)
    return listOfObj

Однако, когда я пытаюсь итеративно загружать файлы Я получаю утечку памяти.

l = ['filepath1', 'filepath2', 'filepath3', 'filepath4']
for fp in l:
    x = loadPickle(fp)
    print( 'loaded {0}'.format(fp) )

Моя память переполнена до loaded filepath2. Как я могу написать код, который гарантирует, что во время каждой итерации загружается только один рассол?

Ответы на связанные вопросы о SO предлагают использовать объекты, определенные в модуле weakref или явную сборку мусора, используя модуль gc, но мне сложно понять, как применить эти методы к моему конкретному варианту использования. Это потому, что у меня недостаточно понимания того, как ссылки работают под капотом.

Связанный: сборщик мусора Python

4b9b3361

Ответ 1

Вы можете исправить это, добавив x = None сразу после for fp in l:.

Причина этого заключается в том, что она будет заменять переменную x, hance, позволяющую сборщику мусора python освобождать некоторую виртуальную память перед вызовом loadPickle() во второй раз.