因此,我最近开始分析比以前大得多的数据集,并意识到我的代码在速度方面不够高效。
为了使脚本的某些部分更快,我决定并行执行一些lapply
调用。
这是我的原始行,它可以运行,但是速度很慢:
list_vect <- lapply(X = df1$start, function(x){
vect_of_num <- which(df2$start <= x + 500 & df2$start >= x - 500)
})
我第一次尝试并行是这样的:
cl <- makeCluster(detectCores() -2) # 6 out of 8 cores
list_vect <- parLapply(cl, X = df1$start, function(x){
vect_of_num <- which(df2$start <= x + 500 & df2$start >= x - 500)
})
哪个会发生错误,告诉我df2不存在
根据建议,我在外部创建了函数:
get_list_vect <- function(var1, var2){
vect_of_num <- which(var2$start <= var1 + 500 & var2$start >= var1 - 500)
}
cl <- makeCluster(detectCores() -2) # 6 out of 8 cores
list_vect <- parLapply(cl = cl, df1$start, df2$start, get_list_vect)
这最后一段代码确实运行了,但是我觉得我做错了什么。当使用lapply时,我可以在监视屏幕上看到内存使用率稳定(大约8go)。但是,当调用parLapply时,我看到内存使用率不断增加,直到达到32Go的最大值,然后系统冻结。
我希望你们能看到我错了。随时提出更好的方法。
答案 0 :(得分:1)
使用非等额联接的data.table方法:
require(data.table)
# crate data.tables:
dt1 <- data.table(start = df1$start)
dt2 <- data.table(start = df2$start)
# calculate begining and end values
dt2[, beg := start - 500L]
dt2[, end := start + 500L]
# add indexes
dt1[, i1 := .I]
dt2[, i2 := .I]
# join:
x <- dt2[dt1, on = .(end >= start, beg <= start), allow.cartesian = T]
x[, .(.(i2)), keyby = i1]
# i1 V1
# 1: 1 788,1148,2511,3372,5365,8315,...
# 2: 2 2289,3551,4499,4678,4918,5008,...
# 3: 3 2319,3459,3834,5013,6537,9714
r <- x[, .(.(i2)), keyby = i1][[2]] # transform to list
all.equal(list_vect, r)
# TRUE