Sto gestendo alcuni set di dati di grandi dimensioni e sto facendo tutto il possibile per rispettare i limiti di memoria di R. Una domanda riguarda la sovrascrittura di oggetti R. Ho un grande data.table
(o qualsiasi oggetto R), e deve essere copiato più volte su tmp
. La domanda è: fa qualche differenza se cancello tmp
prima di sovrascriverlo? In Codice:Come viene gestita la memoria durante la sovrascrittura degli oggetti R?
for (1:lots_of_times) {
v_l_d_t_tmp <- copy(very_large_data_table) # Necessary copy of 7GB data
# table on 16GB machine. I can
# afford 2 but not 3 copies.
### do stuff to v_l_d_t_tmp and output
rm (v_l_d_t_tmp) # The question is whether this rm keeps max memory
# usage lower, or if it is equivalent to what an
# overwrite will automatically do on the next iteration.
}
Si supponga che la copia è necessario (se raggiungo un punto in cui ho bisogno di leggere very_large_data_table
dal disco ad ogni ciclo, lo farò, ma la domanda sorge: ce la farà alcuna differenza su utilizzo massimo della memoria se elimini esplicitamente v_l_d_t_tmp
prima di caricarlo nuovamente?).
Oppure, per insegnare all'uomo a pescare, cosa avrei potuto digitare (all'interno di R, non entriamo nello ps
) per rispondere a me stesso?
È assolutamente OK se la risposta risulta essere: "Garbage collection affidabile".
Non è un esperto, ma non dovrebbe fare la differenza. In entrambi i casi, la posizione di memoria originale non è più indicata da un simbolo, quindi è idonea per la garbage collection (felice di essere corretta dagli esperti). Una cosa da considerare è se il tuo 'data.table' ha davvero bisogno di essere copiato. È progettato per essere modificato in base al riferimento in modo da non doverlo fare. – BrodieG
Come dice @BrodieG usando 'rm' dice a' R' che non è più necessario accedere a 'v_l_d_t_tmp' e la memoria occupata da questa tabella diventa idonea per la garbage collection. Tuttavia, la garbage collection non ha luogo quando chiamate 'rm', ma" automaticamente ", quando necessario. Questo non sempre funziona bene, quindi puoi forzare la garbage collection chiamando 'gc()' subito dopo aver chiamato 'rm (...)'. Questo potrebbe far funzionare il tuo loop. Tuttavia, secondo la mia esperienza, è necessario riavviare R affinché la memoria venga cancellata correttamente (il che significherebbe leggere gli input per ogni iterazione, probabilmente piuttosto lento). – konvas
Dalla mia esperienza personale - confido Garbage Collector. Abbiamo analizzato i dati genomici e abbiamo sovrascritto tutti i frame di dati con quelli nuovi, ma non ho alcun background teorico a supporto ... –