2013-04-05 17 views
11

mam 6 GB pamięci w moim komputerze (Windows 7 Pro 64-bitowy) oraz w R, mamEfektywne zarządzanie pamięcią w R

> memory.limit() 
6141 

Oczywiście, gdy mamy do czynienia z dużymi danych, występuje błąd alokacji pamięci. Tak więc w celu dokonania R, aby korzystać z pamięci wirtualnej, używam

> memory.limit(50000) 

Teraz, gdy uruchomiony mój skrypt, nie mam błąd alokacji pamięci dłużej, ale R wieprze cała pamięć w moim komputerze więc mogę nie używaj maszyny, dopóki skrypt się nie skończy. Zastanawiam się, czy istnieje lepszy sposób, aby R zarządzał pamięcią maszyny. Myślę, że może to zrobić, jeśli korzysta się z pamięci wirtualnej, jeśli korzysta ona z pamięci fizycznej w stopniu większym niż określony przez użytkownika. Czy jest jakaś taka opcja?

Odpowiedz

9

Spójrz na FF i bigmemory pakietach. Wykorzystuje to funkcje, które wiedzą o obiektach R, aby utrzymać je na dysku, zamiast pozwolić systemowi operacyjnemu (który tylko wie o porcjach pamięci, ale nie o tym, co reprezentuje).

5

R nie zarządza pamięcią urządzenia. To jest obowiązek systemu operacyjnego. Jedynym powodem memory.size i memory.limit istnieć w systemie Windows, ponieważ jest (od help("Memory-limits")):

Under Windows, R imposes limits on the total memory allocation 
available to a single session as the OS provides no way to do so: 
see 'memory.size' and 'memory.limit'. 

R obiektów również zajmować ciągłą przestrzeń w pamięci RAM, więc można uruchomić w kwestii alokacji pamięci tylko kilka dużych obiektów. Prawdopodobnie możesz być bardziej ostrożny z liczbą/wielkością tworzonych obiektów i unikać używania tak dużej ilości pamięci.

+0

Lub zainwestuj w więcej pamięci RAM. – Roland

3

To nie jest rozwiązanie, ale sugestia. W miarę możliwości używaj obiektów wydajnych pamięciowo: na przykład użyj macierzy zamiast danych.frame.

Oto przykład

m = matrix(rnorm(1000), 2, 2) 
d = as.data.frame(m) 
object.size(m) 
232 bytes 
object.size(d) 
808 bytes 
+3

Ten przykład wydaje się podkreślać tylko bardzo małą różnicę w przydzielaniu stałych danych. Przyjmij matrycę jako 'm = matrix (rnorm (1000), 20000, 10)' i różnice wielkości między obiektami stają się pomijalne. W rzeczywistości sprawdzając to dla jakiegoś losowego 'data.frame', które miałem w moim obszarze roboczym, wersja' matrix' była 2 razy większa. Więc nie sądzę, że ta sugestia jest przydatna dla danego problemu. – eddi

+1

Nie. Nie zgadzam się. Macierz jest bardziej wydajna niż data.frame. Jest to jeden z powodów, dla którego wewnętrznie wiele funkcji R będzie wymuszać dane macierzy, które znajdują się w ramkach danych. Wspominam wyraźnie, że moja odpowiedź jest tylko sugestią najlepszej praktyki, jeśli chcesz. Dla twojego drugiego komentarza (random data.frame mniejszy niż wersja matrycy) Myślę, że jest fałszywy. – agstudy

+0

To jest to, co widzę dla określonego 'data.frame', które mam w moim obszarze roboczym. 'object.size (as.data.frame (rec)): 11542192 bajty' i' object.size (as.matrix (rec)): 26516160 bajtów'. – eddi