Ho 50 file pickle da 0,5 GB ciascuno. Ogni file pickle è composto da un elenco di oggetti classe personalizzati. Non ho problemi di caricare i file singolarmente utilizzando la funzione seguente:Come evitare perdite di memoria quando carico file di pickle di grandi dimensioni in un ciclo for?
def loadPickle(fp):
with open(fp, 'rb') as fh:
listOfObj = pickle.load(fh)
return listOfObj
Tuttavia, quando provo a caricare i file in modo iterativo ottengo una perdita di memoria.
l = ['filepath1', 'filepath2', 'filepath3', 'filepath4']
for fp in l:
x = loadPickle(fp)
print('loaded {0}'.format(fp))
La memoria viene espulsa prima dello loaded filepath2
. Come posso scrivere codice che garantisca che sia caricato un solo pickle durante ogni iterazione?
Le risposte a domande correlate su SO suggeriscono l'utilizzo di oggetti definiti nel modulo weakref
o la garbage collection esplicita utilizzando il modulo gc
, ma sto avendo difficoltà a capire come applicare questi metodi al mio caso d'uso specifico. Questo perché ho una comprensione insufficiente di come funziona la referenziazione sotto il cofano.
correlati: Python garbage collection
prova ad aggiungere 'x = Nessuno' subito dopo' per fp in l: ' –
Ciao Ionut Hulub, grazie. Ha funzionato! –
Qui non c'è alcuna perdita di memoria. È solo che il vecchio valore 'x' non può essere rilasciato fino a quando non viene assegnato il nuovo valore, quindi è necessario disporre di memoria sufficiente per avere due valori in memoria contemporaneamente. – abarnert