尚未支持mclapply长向量

时间:2014-04-22 22:12:31

标签: r

我试图运行一些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功能?

2 个答案:

答案 0 :(得分:14)

mclapply无法将工作线程中的所有数据发送回主线程。这是因为预先调度,每个线程运行大量迭代,然后同步所有数据。这很好而且速度很快,但会导致发送回2GB以上的数据,而这是无法做到的。

使用mclapply运行mc.preschedule=F以关闭预先安排。现在,每次迭代都会产生自己的线程并返回自己的数据。它不会那么快,但它可以解决问题。

答案 1 :(得分:-1)

尝试使用nextElem()包中的iterators。它的作用类似于"generator" in Python,因此您无需将整个列表加载到内存中。