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 ciągłych bloków pamięci ( stąd ):
Komunikaty o błędach rozpoczynające się nie mogą przydzielić wektora rozmiaru wskazują na niepowodzenie w uzyskaniu pamięci, ponieważ rozmiar przekracza limit przestrzeni adresowej dla procesu lub, co bardziej prawdopodobne, ponieważ system nie był w stanie zapewnić pamięci. Należy zauważyć, że w przypadku kompilacji 32-bitowej może być wystarczająco dużo dostępnej pamięci, ale nie wystarczająco duży ciągły blok przestrzeni adresowej, na który można by go zmapować.
Jak mogę to obejść? Moją główną trudnością jest to, że docieram do pewnego punktu w moim skrypcie, a R nie może przydzielić 200-300 Mb dla obiektu ... Tak naprawdę nie mogę wstępnie przydzielić bloku, ponieważ potrzebuję pamięci do innego przetwarzania. Dzieje się tak nawet wtedy, gdy skrupulatnie usuwam niepotrzebne przedmioty.
EDYCJA: Tak, przepraszam: Windows XP SP3, 4 Gb 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
Calloc
i zFree
pamięcią, ale podejrzewam, że to nie jest to, co robi Benjamin.Odpowiedzi:
Zastanów się, czy naprawdę potrzebujesz wszystkich tych danych bezpośrednio, czy też macierz może być rzadka? Jest dobre wsparcie w R (zobacz
Matrix
np. Pakiet) dla rzadkich macierzy.Ogranicz wszystkie inne procesy i obiekty w R do minimum, gdy musisz tworzyć obiekty o tym rozmiarze. Użyj,
gc()
aby wyczyścić nieużywaną pamięć lub lepiej utworzyć obiekt, którego potrzebujesz, w jednej sesji .Jeśli powyższe nie pomoże, zdobądź 64-bitową maszynę z taką ilością pamięci RAM, na jaką Cię stać, i zainstaluj 64-bitową wersję 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
(lubbigmemory
jak wspomina Sascha), pomogą ci zbudować nowe rozwiązanie. Z mojego ograniczonego doświadczeniaff
wynika, że pakiet jest bardziej zaawansowany, ale należy przeczytaćHigh Performance Computing
temat dotyczący widoków zadań CRAN.źródło
W przypadku użytkowników systemu Windows następujące informacje bardzo pomogły mi w zrozumieniu niektórych ograniczeń pamięci:
gc()
do zbierania śmieci => działa, widzę, że użycie pamięci spada do 2 GBDodatkowe porady, które działają na moim komputerze:
źródło
gc()
jest tylko iluzją. Sprawdzanie Menedżera zadań to po prostu bardzo podstawowa operacja w systemie Windows. Jedyna rada, z którą mogę się zgodzić, to zapisywanie w formacie .RDatagc()
to nie działa. Chodzi mi tylko o to, że R robi to automatycznie, więc nie musisz robić tego ręcznie. Zobacz tutajgc()
DZIAŁA . Po prostu nie musisz go używać, ponieważ R robi to wewnętrznieOto 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źródło
Najprostszym sposobem ominięcia tego ograniczenia jest przełączenie na 64-bitowy R.
źródło
Error: cannot allocate vector of size ... Gb
zamiast tego (ale tak, mam dużo danych).Napotkałem podobny problem i użyłem 2 dysków flash jako „ReadyBoost”. Dwa dyski dały dodatkowe 8 GB pamięci (dla pamięci podręcznej) i rozwiązały problem, a także zwiększyły szybkość całego systemu. Aby użyć Readyboost, kliknij prawym przyciskiem myszy dysk, przejdź do właściwości i wybierz „ReadyBoost” i wybierz przycisk opcji „użyj tego urządzenia” i kliknij zastosuj lub ok, aby skonfigurować.
źródło
Poszedłem na stronę pomocy memor.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,
pomógł mi rozwiązać mój problem.
źródło
Jeśli uruchamiasz skrypt w środowisku linux, możesz użyć tego polecenia:
a serwer przydzieli Ci żądaną pamięć (zgodnie z limitami serwera, ale z dobrym serwerem - można użyć wielkich plików)
źródło
server_name
? Wpadam na to,cannot allocate vector size...
próbując zrobić ogromną macierz terminów dokumentacyjnych na AMI i nie mogę zrozumieć, dlaczego nie ma wystarczającej ilości pamięci, ani o ile więcej muszę wypożyczyć. Dziękuję Ci!Wspomniana powyżej metoda zapisywania / ładowania działa dla mnie. Nie jestem pewien, jak / czy
gc()
rozszarpuje pamięć, ale wydaje się, że działa.źródło