Obsługuję niektóre duże zbiory danych i robię co mogę, aby pozostać pod ograniczeniami pamięci R. Pojawiło się jedno pytanie dotyczące nadpisywania obiektów R. Mam duży obiekt data.table
(lub dowolnego obiektu R), który musi być wielokrotnie kopiowany do tmp
. Pytanie brzmi: czy robi to jakąś różnicę, jeśli usuwam tmp
przed nadpisaniem? W kodzie:W jaki sposób zarządza się pamięcią podczas nadpisywania obiektów 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.
}
Załóżmy, że kopia jest konieczne (Gdybym dotrzeć do punktu, gdzie trzeba czytać very_large_data_table
z dysku na każdej pętli, zrobię to, ale stoi pytanie: będzie żadnej różnicy na maksymalne użycie pamięci, jeśli jawnie usuwam v_l_d_t_tmp
przed ponownym załadowaniem?).
Albo, aby nauczyć człowieka łowienia ryb, co mógłbym napisać (w R, nie wdawać się w ps
), aby samemu odpowiedzieć na to pytanie?
To całkowicie OK, jeśli odpowiedź okaże się: "Zaufaj zbieraniu śmieci."
Nie jest ekspertem, ale nie powinno to mieć znaczenia. W obu przypadkach oryginalna lokalizacja pamięci nie jest już wskazywana przez symbol, więc kwalifikuje się do zbierania śmieci (z przyjemnością poprawią ją eksperci). Jedną z rzeczy do rozważenia jest to, czy twoja 'data.table' naprawdę musi być skopiowana. Został zaprojektowany do modyfikacji przez odniesienie, więc nie musisz tego robić. – BrodieG
Jako @BrodieG powiedział, że używając 'rm' mówi' R', że nie potrzebujesz już dostępu do 'v_l_d_t_tmp', a pamięć zajmowana przez tę tabelę staje się uprawniona do zbierania śmieci. Jednak odśmiecanie nie odbywa się, gdy wywołujesz 'rm', ale" automatycznie ", kiedy jest to konieczne. To nie zawsze działa dobrze, więc możesz wymusić odśmiecenie wywołując 'gc()' zaraz po wywołaniu 'rm (...)'. Może to spowodować, że twoja pętla zadziała. Jednak z mojego doświadczenia naprawdę trzeba zrestartować R, aby pamięć została prawidłowo wyczyszczona (co oznaczałoby czytanie w danych wejściowych dla każdej iteracji, prawdopodobnie dość powolne). – konvas
Z własnego doświadczenia - truciciel zaufania. Przeanalizowaliśmy dane genomiczne i nadpisaliśmy wszystkie ramki danych przez nowe, ale nie mam teoretycznego zaplecza tego ... –