2011-01-16 8 views
6

Przeczytałem kilka wątków dotyczących problemów z pamięcią w R i nie mogę znaleźć rozwiązania mojego problemu.R statystyki - problemy z pamięcią podczas przydzielania dużej macierzy/Linux

Używam rodzaju regresji LASSO na kilku podzbiorach dużego zbioru danych. Dla niektórych podzbiorów działa dobrze, a dla niektórych większych podzbiorów nie działa, z błędami typu "nie można przydzielić wektora o wielkości 1,6 Gb". Błąd występuje w tym wierszu kodu:

example <- cv.glmnet(x=bigmatrix, y=price, nfolds=3) 

Zależy również od liczby zmiennych zawartych w "bigmatrix".

Próbowałem na R i R64 dla komputerów Mac i R na PC, ale ostatnio wszedłem na szybszą maszynę wirtualną pod Linuksem, myśląc, że uniknę problemów z pamięcią. Było lepiej, ale nadal miało pewne ograniczenia, chociaż memory.limit wskazuje "Inf".

Czy mimo to należy wykonać tę pracę lub czy trzeba wyciąć kilka zmiennych w macierzy lub pobrać mniejszy podzbiór danych?

Czytałem, że R szuka niektórych ciągłych bitów pamięci i że może powinienem wstępnie przydzielić macierz? Dowolny pomysł ?

+1

Przy płaskiej 64-bitowej przestrzeni adresowej odnalezienie ciągłej przestrzeni adresowej nie stanowi problemu. –

Odpowiedz

8

Pozwól mi zbudować nieco na to, co @richardh powiedział. Wszystkie dane, które ładujesz, R przeżuwa RAM. Więc ładujesz swoje główne dane i używa trochę porcji pamięci RAM. Następnie podzbiór danych, aby podzbiór używał mniejszego przystawki. Wtedy regresja algo potrzebuje kawałka, który jest większy niż twój podzbiór, ponieważ wykonuje pewne manipulacje i ruchy. Czasami jestem w stanie lepiej wykorzystać RAM, wykonując następujące czynności:

  1. Zapisz początkowego zbioru danych na dysku za pomocą save()
  2. wziąć podzbiór danych
  3. rm() początkowy zestaw danych jest więc nie jest już w pamięci
  4. zrobić analizę w podgrupie
  5. Zapisz wynikami analizy
  6. całkowicie zrzucić wszystkie elementy pamięć: RM (list = ls())
  7. obciążenie wstępne d ataset od kroku 1 z powrotem do pamięci RAM przy użyciu load()
  8. pętla kroki 2-7, ile potrzeba

Bądź ostrożny z kroku 6, a nie próbować strzelać oko. To zrzuca WSZYSTKO w pamięci R. Jeśli nie zostanie zapisany, zniknie. Bardziej subtelnym podejściem byłoby usunięcie dużych obiektów, których na pewno nie potrzebujesz, a nie rm (list = ls()).

Jeśli nadal potrzebujesz więcej pamięci RAM, możesz przeprowadzić analizę w chmurze Amazon. Ich czterokrotna, bardzo duża instancja wysokiej pamięci ma ponad 68 GB pamięci RAM. Czasami, gdy napotykam na ograniczenia pamięci, stwierdzam, że najłatwiej jest po prostu przejść do chmury, w której mogę być tak niechlujny z pamięcią RAM, jak chcę.

Jeremy Anglim ma dobry blog post, który zawiera kilka wskazówek dotyczących zarządzania pamięcią w R. W tym poście na blogu Jeremy prowadzi do strony this previous StackOverflow question, która okazała się pomocna.

+0

@JD - Lepiej powiedzieć! Jestem (powoli) uczę się sposobów. I dobre znalezisko na poprzednim pytaniu SO. –

+0

Twoja odpowiedź była dobra. Właśnie dodałem trochę więcej, ponieważ byłem podejrzliwy, że OP może nie zrozumieć dokładnie tego, do czego zmierzasz. –

2

Nie sądzę, że ma to związek z pamięcią ciągłą, ale tylko, że R domyślnie działa tylko w pamięci RAM (tzn. Nie może zapisywać w pamięci podręcznej). Farnsworth's guide to econometrics in R wymienia pakiet filehash, aby umożliwić zapisywanie na dysku, ale nie mam z tym żadnego doświadczenia.

Najlepiej jest pracować z mniejszymi podzbiorami, zarządzać pamięcią ręcznie, usuwając zmienne, których nie potrzebujesz z rm (tj. Uruchom regresję, zapisz wyniki, usuń starą macierz, załaduj nową macierz, powtórz) i/lub uzyskanie większej ilości pamięci RAM. HTH.

+1

Brak pamięci RAM zwykle nie spowodowałby braku błędów pamięci. System wykorzystywałby stronicowanie do radzenia sobie z brakiem fizycznej pamięci RAM. Możesz rzucić wyzwanie, ale dlaczego zobaczysz awarię alokacji? –

+0

@davide czy masz doświadczenie z R lub czy mówisz z doświadczenia z innym oprogramowaniem? R niewątpliwie zawiedzie, jeśli zabraknie pamięci RAM. –

+0

@JD Co ze stronicowaniem? Czy R jawnie wyłącza stronicowanie na dysk? –

0

Wypróbuj bigmemory package. Jest bardzo łatwy w użyciu. Chodzi o to, że dane są przechowywane w pliku na HDD i tworzysz obiekt w R jako odniesienie do tego pliku. Przetestowałem to i działa bardzo dobrze.

Istnieje również kilka alternatywnych opcji, np. "Ff". Aby uzyskać więcej informacji, patrz CRAN Task View: High-Performance and Parallel Computing with R.

+1

Właśnie wypróbowałem pakiet bigmemory i pakiet ff. Pakiet ff wydaje się lepszy. Jest kranastyczny! ;-) –

+0

jak załadować dane z serwera SQL? – user702846

Powiązane problemy