Pandas GroupBy Speicherfreigabe

Proble

Ich habe festgestellt, dass beim Durchlaufen eines Pandas @ Speicher zugewiesen wurdGruppiere nacas @ -Objekt wird nach der Iteration nicht freigegeben. Ich benutzeresource.getrusage(resource.RUSAGE_SELF).ru_maxrss ( zweite Antwort in diesem Beitrag für Details), um die Gesamtmenge des aktiven Speichers zu messen, der vom Python-Prozess verwendet wird.

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()

druckt den folgenden aktiven Gesamtspeicher (in GB)

0.671732
1.297424
1.297952
1.923288
1.923288
2.548624
Lösungen

Unkommentierendel idx, x undgc.collect() behebt das Problem. Ich muss aberdel Alle Variablen, die auf die DataFrames verweisen, die beim Iterieren über das groupby-Objekt zurückgegeben wurden (dies kann je nach Code in der inneren for-Schleife problematisch sein). Die neuen gedruckten Speicherverwendungen werden zu:

0.671768
1.297412
1.297992
1.297992
1.297992
1.297992

Alternativ kann ich @ auskommentiergb = list(gb). Die daraus resultierende Speichernutzung entspricht in etwa der vorherigen Lösung:

1.32874
1.32874
1.32874
1.32874
1.32874
1.32874
FrageWarum wird der Speicher für DataFrames, der sich aus der Iteration durch die Gruppe ergibt, nach Abschluss der Iteration nicht freigegeben? Gibt es eine bessere Lösung als die beiden oben? Wenn nicht, welche dieser beiden Lösungen ist "besser"?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage