2012-07-19 22 views
17

Próbuję połączyć dwie ramki danych: jedna zawiera 908450 obserwacji 33 zmiennych, a druga 908450 obserwacji 2 zmiennych.Przekroczenie limitu pamięci w R (nawet przy 24 GB RAM)

dataframe2 <-merge(dataframe1, dataframe2, by="id") 

mam wyczyszczone wszystkie inne dataframes z pamięci roboczej i zresetować limit pamięci (na nowym komputerze z 24 GB pamięci RAM) za pomocą kodu:

memory.limit(24576) 

Ale ja” m wciąż otrzymuję błąd Cannot allocate vector of size 173.Mb.

Jakieś przemyślenia na temat tego, jak obejść ten problem?

+4

pakietu 'data.table' mogą być bardziej wydajne i pamięć o wiele szybciej niż' data.frames' ponieważ to sprawia, że ​​mniej kopii danych. – Chase

+2

Czy faktycznie używasz 24 Gb i powiązane, czy twój 64-bitowy OS jest? –

+0

System operacyjny musi mieć możliwość przydzielenia wymaganej ilości pamięci ciągłej do R. Więc możesz być ograniczony przez inne uruchomione aplikacje. – James

Odpowiedz

21

Aby śledzić moje komentarze, użyj data.table. Przygotowałem krótki przykład pasujący do danych, aby zilustrować:

library(data.table) 

dt1 <- data.table(id = 1:908450, matrix(rnorm(908450*32), ncol = 32)) 
dt2 <- data.table(id = 1:908450, rnorm(908450)) 
#set keys 
setkey(dt1, id) 
setkey(dt2, id) 
#check dims 
> dim(dt1) 
[1] 908450  33 
> dim(dt2) 
[1] 908450  2 
#merge together and check system time: 
> system.time(dt3 <- dt1[dt2]) 
    user system elapsed 
    0.43 0.03 0.47 

Połączenie trwało mniej niż 1/2 sekundy. Zrobiłem przed i po zrzucie ekranu oglądanie mojej pamięci. Przed połączeniem korzystałem z 3,4 gigabajtów pamięci RAM. Kiedy połączyłem się, skoczyłem do 3.7 i wyrównałem. Myślę, że trudno będzie ci znaleźć coś więcej pamięci lub czasu.

Przed: enter image description here

Po: enter image description here

+0

Cześć - Szybkie pytanie. Zmieniłem obie moje ramki danych na tabele danych za pomocą 'dat1_table <-data.table (data1)' i 'dat2_table <-data.table (data2)'. Ale wtedy, gdy próbuję ustawić klucz, pojawia się błąd "Kolumna 2 ma długość 9, która różni się od długości kolumny 1". Liczba wierszy wygląda tak samo, używając 'dim()'. – roody

+0

@roody - to dziwne. Właśnie przetestowałem używając powyższych przykładów, najpierw robiąc im dane.frame, a następnie konwertując na dane. Tabele przy użyciu twojej metody. Nie mogę odtworzyć błędu. Czy jesteś pewien, że 'data1' i' data2' są w rzeczywistości data.frames? Możesz sprawdzić używając 'class()' lub 'str()' lub 'is.data.frame()'. Możesz także spróbować ustawić klucz podczas tworzenia tabeli data.table w jednym poleceniu, np. 'Dt <- data.table (yourDF, key =" yourKey ")' – Chase

+0

Hi Chase - Podobno zmienna data-czas w jednym z zestawów danych mucking rzeczy. I wszystko działało! DZIĘKUJĘ BARDZO! – roody

2

O ile mogę myśleć tam trzy rozwiązania:

  • Wpisz DataTables
  • wykorzystują pamięć wymiany (może być regulowana na maszynach * nix)
  • użycie próbkowania
Powiązane problemy