Grupo Pandas Por desasignación de memoria
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
SolucionesSin 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"?