使用parLapply而不是lapply会使内存使用量激增

时间:2019-08-14 14:07:06

标签: r performance lapply

因此,我最近开始分析比以前大得多的数据集,并意识到我的代码在速度方面不够高效。 为了使脚本的某些部分更快,我决定并行执行一些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的最大值,然后系统冻结。

我希望你们能看到我错了。随时提出更好的方法。

1 个答案:

答案 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