Долгосрочные векторы mclapply еще не поддерживаются

Я пытаюсь запустить некоторый R-код, и он рушится из-за памяти. Ошибка, которую я получаю:

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

Функция, создающая проблемы, следующая:

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)
}

Я запускаю эту функцию, используя mclapply 50k раз. StationUserX вызывает Distance2StationX 90k раз.

Есть ли очевидный способ оптимизации функции StationUserX?

Ответ 1

mclapply возникает проблема с отправкой всех данных из рабочих потоков в основной поток. Это из-за предварительного планирования, где он запускает большое количество итераций на поток, а затем синхронизирует все данные обратно. Это хорошо и быстро, но приводит к возврату > 2 ГБ данных, чего не может сделать.

Запустите mclapply с помощью mc.preschedule=F, чтобы отключить предварительное планирование. Теперь каждая итерация породит собственный поток и вернет свои данные. Это будет не так быстро, но проблема будет решена.

Ответ 2

Попробуйте использовать nextElem() из пакета iterators. Он действует как "generator" в Python, поэтому вам не нужно загружать весь список в память.