¿Cómo evito la pérdida de memoria cuando cargo archivos de gran tamaño en un bucle for?

Tengo 50 archivos pickle de 0.5 GB cada uno. Cada archivo pickle se compone de una lista de objetos de clase personalizados. No tengo problemas para cargar los archivos individualmente usando la siguiente función:

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

Sin embargo, cuando bash cargar de forma iterativa los archivos, se produce una pérdida de memoria.

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

Mi memoria se desborda antes de que se imprima loaded filepath2 . ¿Cómo puedo escribir un código que garantice que solo se carga un pickle durante cada iteración?

Las respuestas a las preguntas relacionadas sobre SO sugieren el uso de objetos definidos en el módulo weakref o la recolección de basura explícita usando el módulo gc , pero me cuesta entender cómo aplicaría estos métodos a mi caso de uso particular. Esto se debe a que tengo una comprensión insuficiente de cómo funcionan las referencias bajo el capó.

Relacionados: recolección de basura de python.

Puede arreglar eso agregando x = None justo después for fp in l:

La razón por la que esto funciona es porque hará una desreferenciación de la variable x , por lo tanto, permitirá que el recolector de basura Python libere algo de memoria virtual antes de llamar a loadPickle() segunda vez.