Pandas GroupPor desalocação de memória

Problema

Notei que a memória alocada enquanto itera através de um PandasGroupBy O objeto não é desalocado após a iteração. eu usoresource.getrusage(resource.RUSAGE_SELF).ru_maxrss (segunda resposta neste post para obter detalhes) para medir a quantidade total de memória ativa usada pelo processo 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 a seguinte memória ativa total (em gb)

0.671732
1.297424
1.297952
1.923288
1.923288
2.548624
Soluções

Sem comentáriodel idx, x egc.collect() corrige o problema. No entanto, tenho quedel todas as variáveis que referenciam os DataFrames retornados iterando sobre o groupby (que pode ser uma dor dependendo do código no loop for interno). Os novos usos da memória impressa se tornam:

0.671768
1.297412
1.297992
1.297992
1.297992
1.297992

Como alternativa, posso descomentargb = list(gb). Os usos de memória resultantes são aproximadamente os mesmos da solução anterior:

1.32874
1.32874
1.32874
1.32874
1.32874
1.32874
QuestõesPor que a memória dos DataFrames resultante da iteração através do grupo não é desalocada após a conclusão da iteração?Existe uma solução melhor do que as duas acima? Caso contrário, qual dessas duas soluções é "melhor"?

questionAnswers(2)

yourAnswerToTheQuestion