Wymuszanie uruchamiania garbage collection W R za pomocą polecenia gc()

Okresowo programuję niechlujnie. Ok, cały czas programuję niechlujnie, ale czasami dopada mnie to w postaci błędów z pamięci. Zaczynam ćwiczyć trochę dyscypliny w usuwaniu obiektów za pomocą polecenia rm () i będzie lepiej. Widzę w Internecie mieszane wiadomości o tym, czy powinienem jawnie wywołać GC() po usunięciu dużych obiektów danych. Niektórzy mówią, że zanim R zwróci błąd pamięci, uruchomi gc (), podczas gdy inni mówią, że ręczne wymuszanie gc jest dobrym pomysłem.

Czy powinienem uruchomić GC () po usunięciu dużych obiektów w celu zapewnienia maksymalnej dostępności pamięci?

Author: JD Long, 2009-09-23

6 answers

"prawdopodobnie."Ja też to robię i często nawet w pętli jak w

cleanMem <- function(n=10) { for (i in 1:n) gc() }
Jednak z mojego doświadczenia wynika, że nie przywraca to Pamięci do nieskazitelnego stanu.

Więc to, co zwykle robię, to trzymanie zadań pod ręką w plikach skryptów i wykonywanie tych za pomocą nakładki' R '(na Uniksie i z pakietu 'littler'). Rscript jest alternatywą dla tego innego systemu operacyjnego.

Że obieg pracy się zgadza z

Które omawialiśmy tutaj wcześniej.
 39
Author: Dirk Eddelbuettel,
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-05-23 11:47:01

Ze strony pomocy na gc:

Wywołanie ' gc ' powoduje śmieci zbiórka odbędzie się. To będzie odbywają się również automatycznie bez interwencja użytkownika, a głównym celem wywołania " gc " jest raport o zużyciu pamięci.

Jednak może być przydatne, aby zadzwonić "gc" po usunięciu dużego obiektu, ponieważ może to skłonić R do zwrócenia pamięci do systemu operacyjnego.

Więc to Może być przydatne do zrobienia, ale przeważnie nie powinieneś. Moja osobista opinia jest taka, że jest to kod ostateczności - nie powinieneś oczywiście zaśmiecać swojego kodu wypowiedziami gc(), ale jeśli twoja maszyna ciągle się przewraca, a próbowałeś wszystkiego innego, może to być pomocne.

Mówiąc Wszystko inne, mam na myśli rzeczy takie jak

  1. Pisanie funkcji zamiast surowych skryptów, więc zmienne wychodzą poza zakres.

  2. Opróżnianie przestrzeni roboczej, jeśli przejdziesz od jednego problemu do kolejny niepowiązany.

  3. Odrzucanie danych / zmiennych, które cię nie interesują. (Często otrzymuję arkusze kalkulacyjne z dziesiątkami nieciekawych kolumn.)

 19
Author: Richie Cotton,
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
2016-10-06 05:56:22

Trochę za późno na imprezę, ale:

Jawne wywołanie gc zwolni część pamięci "teraz". ... więc jeśli inne procesy potrzebują pamięci, może to być dobry pomysł. Na przykład przed wywołaniem system lub podobnego. A może kiedy" skończysz " ze skryptem i R będzie siedział bezczynnie przez jakiś czas, aż nadejdzie następne zadanie-znowu, tak że inne procesy zyskają więcej pamięci.

Jeśli chcesz, aby twój skrypt działał szybciej, nie będzie to miało znaczenia, ponieważ R zadzwoni później, jeśli będzie potrzebował za. Może nawet być wolniejszy, ponieważ normalny cykl GC nigdy nie musiał go nazywać.

...ale jeśli chcesz zmierzyć czas, na przykład, jest to zazwyczaj dobry pomysł, aby zrobić GC przed uruchomieniem testu. To jest to, co system.time robi domyślnie.

UPDATE Jak wskazuje @ DWin, R (lub C#, lub Java itp.) nie zawsze wie, kiedy pamięć jest niska i GC musi działać. Więc może czasami trzeba zrobić GC jako obejście dla braków w systemie pamięci.

 12
Author: Tommy,
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-05-10 08:31:32

Podobno r używa tylko PAMIĘCI RAM. To po prostu nie jest prawda na Macu (i podejrzewam, że nie jest to prawda na Windows też.) Jeśli zabraknie pamięci RAM, zacznie używać pamięci wirtualnej. Czasami, ale nie zawsze, procesy 'rozpoznają', że muszą uruchomić GC() i zwolnić pamięć. Gdy tego nie zrobią, możesz to zobaczyć za pomocą ActivityMonitor.aplikacji i widząc, że cała pamięć RAM jest zajęta, a dostęp do dysku podskoczył. Stwierdzam, że kiedy robię duże przebiegi regresji Coxa, których mogę uniknąć przelanie do pamięci wirtualnej (z wolnym dostępem do dysku) przez wcześniejsze wywołania z gc(); cph(...)

 11
Author: 42-,
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-05-09 18:17:03

Nie. Jeśli nie ma wystarczającej ilości pamięci do operacji, R uruchomi gc() automatycznie.

 8
Author: hadley,
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
2009-09-23 22:02:19

"może."Tak naprawdę nie mam ostatecznej odpowiedzi. Ale plik pomocy sugeruje, że istnieją naprawdę tylko dwa powody, dla których należy wywołać GC ():

  1. chcesz raport zużycia pamięci.
  2. po usunięciu dużego obiektu, " może monitować R o powrót pamięci do systemu operacyjnego."

Ponieważ może spowolnić dużą symulację z powtarzającymi się wywołaniami, mam tendencję do robienia tego tylko po usunięciu czegoś dużego. Innymi słowy, nie sądzę, że to ma sens, aby systematycznie dzwoń cały czas, chyba że masz ku temu dobry powód.

 6
Author: Shane,
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
2009-09-23 17:36:57