Jaka jest różnica między gc () a rm()
Okresowo czyszczę pamięć w R za pomocą wywołania rm(list=ls())
.
Czy muszę potem zadzwonić do garbage collector gc()
?
Jaka jest różnica między tymi 2 funkcjami? Czy gc()
wywołuje rm()
dla pewnych zmiennych?
3 answers
Po pierwsze, ważne jest, aby pamiętać, że te dwa są bardzo różne, ponieważ gc
nie usuwa żadnych zmiennych, które nadal używasz - zwalnia pamięć tylko dla tych, do których nie masz już dostępu(czy to usuniętych za pomocą rm()
, czy, powiedzmy, utworzonych w funkcji, która od tego czasu wróciła). Uruchomienie gc()
nigdy nie spowoduje utraty zmiennych.
Pytanie, czy należy zadzwonić gc()
po wywołaniu rm()
, jest jednak dobre. dokumentacja dla gc pomocne uwagi:
Wywołanie gc powoduje odbieranie śmieci. Odbywa się to również automatycznie bez interwencji użytkownika, a głównym celem wywołania gc jest raport o użyciu pamięci.
Może być jednak użyteczne wywołanie gc po usunięciu dużego obiektu, ponieważ może to skłonić R do powrotu pamięci do systemu operacyjnego.
Więc odpowiedź jest taka, że może być dobrze zadzwonić gc()
(a przynajmniej nie zaszkodzi), nawet chociaż prawdopodobnie i tak zostanie uruchomiony (jeśli nie od razu, to wkrótce).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 07:29:50
Osobiście lubię dodawać gc()
do pętli, aby zwolnić trochę pamięci RAM, gdy pętle zaczną zapełniać dostępną przestrzeń. Coś jak
for(i in 1:1000){
res[[i]] = some operation
gc()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 15:55:51
Re: komentarz do kary gc, choć to prawda, można oczywiście zdecydować się na wywołanie gc co N iteracji w pętli (gdzie N może być parametryzowane na wiele sposobów). W przypadku pętli, w których liczba iteracji jest duża, ale wykorzystanie zasobów w danej iteracji jest skromniejsze, może nie być konieczne wykonywanie GC każdej iteracji, aby odzyskać pożądaną wydajność.
Oczywiście, jeśli zapętlasz bardzo dużą liczbę iteracji o bardzo wysokim użyciu, jest to inna historia, ale na tym etapie może się zdarzyć, że kod musi być po prostu wektoryzowany i / lub nawet napisany w innym języku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 14:01:41