Zarządzanie pamięcią R / nie można przydzielić wektora wielkości N Mb

Mam problemy z używaniem dużych obiektów w R. na przykład:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

Rozumiem, że jest to związane z trudnością uzyskania sąsiadujących bloków pamięci (z tutaj):

Rozpoczynanie komunikatów o błędach nie może przeznaczyć wektor wielkości wskazuje a brak pamięci, albo Ponieważ rozmiar przekroczył adres-limit miejsca dla procesu lub, bardziej prawdopodobne, ponieważ system był nie mogę dostarczyć pamięci. Uwaga że na 32-bitowej kompilacji może dobrze być wystarczająco wolnej pamięci dostępnej, ale nie wystarczająco duży przylegający blok przestrzeń adresowa, do której można ją mapować.

Jak mogę to obejść? Moja główna trudność polega na tym, że dochodzę do pewnego punktu w moim skrypcie i R nie może przeznaczyć 200-300 Mb dla obiektu... Nie mogę wstępnie przydzielić bloku, ponieważ potrzebuję pamięci do innego przetwarzania. Dzieje się tak nawet wtedy, gdy delikatnie usuwam niepotrzebne przedmioty.

EDIT: tak, przepraszam: Windows XP SP3, 4GB RAM, R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
Author: Gregor Thomas, 2011-03-02

9 answers

Zastanów się, czy naprawdę potrzebujesz wszystkich tych danych jawnie, czy może macierz być rzadka? Istnieje dobre wsparcie w R (patrz Matrix pakiet dla np.) dla rzadkich macierzy.

Zachowaj wszystkie inne procesy i obiekty w R do minimum, gdy musisz tworzyć obiekty o takim rozmiarze. Użyj gc(), aby wyczyścić nieużywaną pamięć, lub lepiej Utwórz tylko potrzebny obiekt w jednej sesji.

Jeśli powyższe nie może pomóc, Pobierz 64-bitową maszynę z taką ilością pamięci RAM, na jaką cię stać, i zainstaluj 64-bit R.

Jeśli nie możesz tego zrobić, istnieje wiele usług online do zdalnego przetwarzania.

Jeśli nie możesz tego zrobić, narzędzia do mapowania pamięci, takie jak pakiet ff (lub bigmemory, Jak wspomina Sascha), pomogą Ci zbudować nowe rozwiązanie. Z mojego ograniczonego doświadczenia ff jest bardziej zaawansowanym pakietem, ale powinieneś przeczytać temat High Performance Computing na temat widoków Zadań CRAN.

 85
Author: mdsumner,
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-01-08 11:11:54

Dla użytkowników systemu Windows, poniższe bardzo pomogły mi zrozumieć pewne ograniczenia pamięci:

  • przed otwarciem R otwórz monitor zasobów systemu Windows (Ctrl-Alt-Delete / Uruchom Menedżera zadań / kartę Wydajność / kliknij dolny przycisk "Monitor zasobów" / kartę pamięci)
  • zobaczysz, ile pamięci RAM u nas już używane przed otwarciem R, i przez które aplikacje. W moim przypadku używa się 1,6 GB z wszystkich 4GB. Więc będę mógł dostać tylko 2,4 GB na R, ale teraz przychodzi tym gorzej...
  • Otwórz R i Utwórz zestaw danych 1.5 GB, a następnie zmniejsz jego rozmiar do 0.5 GB, Monitor zasobów pokazuje, że moja pamięć RAM jest używana w prawie 95%.
  • użyj {[0] } aby zrobić garbage collection = > to działa, widzę, że zużycie pamięci spadnie do 2 GB

Tutaj wpisz opis obrazka

Dodatkowa rada, która działa na mojej maszynie:

  • Przygotuj funkcje, Zapisz jako plik RData, Zamknij R, Otwórz ponownie R i załaduj funkcje pociągu. Menedżer zasobów zazwyczaj pokazuje niższą Użycie pamięci, co oznacza, że nawet gc () nie odzyskuje całej możliwej pamięci, a zamknięcie/ponowne otwarcie R działa najlepiej, aby rozpocząć z maksymalną dostępną pamięcią.
  • Druga sztuczka polega na załadowaniu zestawu treningowego tylko do treningu (nie ładuj zestawu testowego, który zazwyczaj może być o połowę mniejszy niż zestaw treningowy). Faza treningu może wykorzystywać pamięć do maksimum( 100%), więc wszystko, co dostępne, jest przydatne. Wszystko to ma być z przymrużeniem oka, ponieważ eksperymentuję z pamięcią R limity.
 61
Author: Timothée HENRY,
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
2014-07-15 10:16:44

Poszedłem na stronę pomocy memory.limit i dowiedziałem się, że na moim komputerze r domyślnie może używać do ~ 1,5 GB PAMIĘCI RAM i że użytkownik może zwiększyć ten limit. Używając poniższego kodu,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)
Pomógł mi rozwiązać mój problem.
 21
Author: Rajib Kumar De,
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
2020-08-05 10:15:51

Oto prezentacja na ten temat, która może Cię zainteresować:

Http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

Sam nie próbowałem omawianych rzeczy, ale bigmemory pakiet wydaje się bardzo przydatny

 16
Author: Sacha Epskamp,
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
2011-03-02 18:32:15

Najprostszym sposobem na uniknięcie tego ograniczenia jest przejście na 64-bitowy R.

 14
Author: David Heffernan,
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
2011-03-03 20:14:08

Napotkałem podobny problem i użyłem 2 pendrive 'ów jako 'ReadyBoost'. Oba dyski dały dodatkowe 8GB doładowania pamięci (dla pamięci podręcznej) i rozwiązały problem, a także zwiększyły szybkość systemu jako całości. Aby użyć Readyboost, kliknij prawym przyciskiem myszy na dysku, przejdź do właściwości i wybierz "ReadyBoost" i wybierz przycisk radiowy "użyj tego urządzenia" i kliknij zastosuj lub ok, aby skonfigurować.

 13
Author: Kwaku Damoah,
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
2015-12-10 20:31:29

Jeśli uruchamiasz skrypt w środowisku linux, możesz użyć tego polecenia:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

I serwer przydzieli żądaną pamięć dla Ciebie (zgodnie z limitami serwera, ale przy dobrym serwerze można użyć Plików)

 9
Author: nurit,
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-03-20 18:04:49

Opisana powyżej metoda save/load działa dla mnie. Nie jestem pewien jak / Czy gc() defragmentuje pamięć, ale to chyba działa.

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
 3
Author: Simon Woodward,
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-02-26 00:48:11

Mam 2GB 32-bitowy laptop z windows 10. I miałem do czynienia z tym samym problemem R. Napotkałem problem nie można przydzielić wektora 150MB, i tak.. Włożyłem więcej pamięci RAM , płytę RAM o pojemności 1GB na moim laptopie, jeśli byłby to problem z pamięcią RAM, różnica 150MB zostałaby całkowicie pokryta.

Sytuacja wcale się nie poprawiła.. Miałem dokładnie taki sam problem jak z 2GB RAM... nie można przydzielić wektora 150Mb....Zrobiłem pamięć.limit trick i polecenie gc() wspomniane wcześniej, ale żadna różnica.

Jestem bardzo przekonany, że ten problem jest kwestią korzystania z 32-bitowego systemu operacyjnego i nie jest bezpośrednio związany z pamięcią RAM. Więc rozwiązaniem tego jest 64-bitowy OS.

 0
Author: Petros Kires,
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
2021-02-11 15:48:08