Grupo Pandas Por desasignación de memoria

Problema

Noté que la memoria asignada al iterar a través de un pandasAgrupar por el objeto no se desasigna después de la iteración. yo sueloresource.getrusage(resource.RUSAGE_SELF).ru_maxrss (segunda respuesta en esta publicación para más detalles) para medir la cantidad total de memoria activa utilizada por el proceso de Python.

import resource
import gc

import pandas as pd
import numpy as np

i = np.random.choice(list(range(100)), 4000)
cols = list(range(int(2e4)))

df = pd.DataFrame(1, index=i, columns=cols)

gb = df.groupby(level=0)
# gb = list(gb)
for i in range(3):
    print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e6)
    for idx, x in enumerate(gb):
        if idx == 0:
            print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e6)
    # del idx, x
    # gc.collect()

imprime la siguiente memoria activa total (en gb)

0.671732
1.297424
1.297952
1.923288
1.923288
2.548624
Soluciones

Sin comentariosdel idx, x ygc.collect() soluciona el problema Sin embargo, tengo quedel todas las variables que hacen referencia a los DataFrames devuelven iterando sobre groupby (lo que puede ser una molestia dependiendo del código en el bucle for interno). Los nuevos usos de la memoria impresa se convierten en:

0.671768
1.297412
1.297992
1.297992
1.297992
1.297992

Alternativamente, puedo descomentargb = list(gb). Los usos de memoria resultantes son aproximadamente los mismos que los de la solución anterior:

1.32874
1.32874
1.32874
1.32874
1.32874
1.32874
Preguntas¿Por qué la memoria para DataFrames resultante de la iteración a través del grupo no se desasigna después de que se completa la iteración?¿Hay una solución mejor que las dos anteriores? Si no, ¿cuál de estas dos soluciones es "mejor"?

Respuestas a la pregunta(2)

Su respuesta a la pregunta