2014-04-22 32 views
11

Próbuję uruchomić kod R i awarie z powodu pamięci. Błąd, który pojawia się:Długie wektory mclapply nie są jeszcze obsługiwane

Error in sendMaster(try(lapply(X = S, FUN = FUN, ...), silent = TRUE)) : 
    long vectors not supported yet: memory.c:3100 

Funkcja, która stwarza problemy to:

StationUserX <- function(userNDX){ 
    lat1 = deg2rad(geolocation$latitude[userNDX]) 
    long1 = deg2rad(geolocation$longitude[userNDX]) 
    session_user_id = as.character(geolocation$session_user_id[userNDX]) 
    #Find closest station 
    Distance2Stations <- unlist(lapply(stationNDXs, Distance2StationX, lat1, long1)) 
    # Return index for closest station and distance to closest station 
    stations_userX = data.frame(session_user_id = session_user_id, 
           station = ghcndstations$ID[stationNDXs], 
           Distance2Station = Distance2Stations)  
    stations_userX = stations_userX[with(stations_userX, order(Distance2Station)), ] 
    stations_userX = stations_userX[1:100,] #only the 100 closest stations... 
    row.names(stations_userX)<-NULL 
    return(stations_userX) 
} 

uruchomić tę funkcję za pomocą mclapply 50k razy. StationUserX dzwoni do Distance2StationX 90k razy.

Czy istnieje oczywisty sposób optymalizacji funkcji StationUserX?

+0

Czy masz "Vectorize" lub 'cmpfun' '' '' '' '' '' '' '' '' –

+0

również myśleć o "foreach" dla równoległości, co jest trywialne w implementacji –

Odpowiedz

13

mclapply ma problem z wysłaniem wszystkich danych z wątków roboczych do wątku głównego. Dzieje się tak z powodu przedawnienia, w którym uruchamiana jest duża liczba iteracji na wątek, a następnie synchronizowane są wszystkie dane z powrotem. To miło i szybko, ale powoduje, że wysyłane są> 2 GB danych, których nie można wykonać.

Uruchom mclapply z mc.preschedule=F, aby wyłączyć planowanie wstępne. Teraz każda iteracja tworzy własny wątek i zwraca własne dane. To nie potrwa tak szybko, ale rozwiązuje problem.

-1

Spróbuj użyć nextElem() z pakietu iterators. Działa to jak "generator" in Python, więc nie trzeba ładować całej listy do pamięci.

+0

Patrzę na stronę man dla nextElem, ale tak naprawdę nie rozumiem, jak powinienem zmodyfikować moją funkcję, aby z niego korzystać. Czy możesz mi pokazać? Dzięki! – Ignacio

+0

Czy możesz powiedzieć, który obiekt jest "długim wektorem", który powoduje problemy? Chodzi o to, że użyjesz '' 'nextElem()' '', aby przekazywać elementy wektora jeden po drugim, zamiast przekazywać cały wektor za jednym zamachem. – rsoren

+0

Komunikat o błędzie tak naprawdę nie mówi. Dzwonię do StationUserX z mclapply i przekazując StationUserX. StationUserX Jest wektorem obserwacji 50k. Obiekt wytwarzany przez funkcję, stacje_użytkownik jest naprawdę dużym obiektem. Mam 100 stacji razy 50 000 użytkowników. Tak więc wynik będzie miał 5 Millon wierszy i 3 kolumny. – Ignacio

Powiązane problemy