问题描述
我正在使用 sNow::parapply() 计算大量点之间的成对距离。不幸的是,我不能使用任何现有的平行成对距离包,例如paralleldist,因为我计算的是圆柱体上点之间的距离,而不是平面,所以我需要使用自定义距离方程。
我遇到的问题是 R 中的内存分配。我不断收到错误消息:'内存耗尽(达到限制?)'。
更具体地说:
-
我有一个名为“matrix_coord_cart”的数据框,包含 14,523 个点及其 x 和 y 坐标。 x 坐标范围为 1-128。 y 坐标范围为 1-288。
-
我有第二个数据框,其中包含 128 列和 288 行,并包含上述点。
-
我想计算所有点之间的成对距离,但考虑到它们位于圆柱体上,我想要每组点之间的最短距离。为此,我遵循此处建议的等式:https://math.stackexchange.com/questions/1488345/what-is-the-shortest-distance-between-two-2d-points-on-the-surface-of-a-cylinder .
-
这是我用来计算点之间成对距离的代码。当我对坐标矩阵进行子集化时它工作得很好,但是当我包含所有点时会产生内存故障。
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 (将#修改为@)