在雪中使用 parapply 函数的内存问题:内存耗尽达到限制?

问题描述

我正在使用 sNow::parapply() 计算大量点之间的成对距离。不幸的是,我不能使用任何现有的平行成对距离包,例如paralleldist,因为我计算的是圆柱体上点之间的距离,而不是平面,所以我需要使用自定义距离方程。

我遇到的问题是 R 中的内存分配。我不断收到错误消息:'内存耗尽(达到限制?)'。

更具体地说:

library(doSNow)

ncores <- parallel::detectCores() - 1
cl <- makeCluster(ncores)

cases <- expand.grid(i = 1:nrow(matrix_coord_cart),j = 1:nrow(matrix_coord_cart))
cases

my_function <- function(x,matrix,df){
  
  i <- matrix[x["j"],]
  j <- matrix[x["i"],]
  
  ifelse(abs(j[,1]-i[,1]) < (ncol(df)/2),sqrt(((j[,1] -i[,1])^2) +((j[,2] - i[,2])^2)),sqrt(((ncol(df) - (j[,1] - i[,1]))^2) + ((j[,2] - x[,2])^2)))

  }

clusterExport(cl,"matrix")
clusterExport(cl,"df")


result <- sNow::parapply(cl = cl,# our cluster object
                   X = cases,# the array to iterate over
                   FUN = my_function,# the function to apply
                   MARGIN = 1,matrix = matrix_coord_cart,df = df)

stopCluster(cl)

有人对我如何解决这个内存问题有任何想法吗?我实际上并不需要所有点集之间的成对距离,因为无论如何我都会对所有成对距离求和。有没有办法阻止 parapply 保存所有成对距离,而是将它们相加,最后只保存一个值?或者,我可以将 parapply 的输出保存在我的磁盘上而不是 R 内存中吗?对于保存在我磁盘上的大型矩阵,我使用 foreach 包和 bigmemory 包进行了相同的计算,但这比 parapply 函数慢得多。

我感谢任何建议!如果我不清楚或没有包含所有必要的信息,请告诉我,这是我第一次在 StackOverflow 上发帖。

干杯!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)