我在一个循环中运行函数 parLapply 并验证一个奇怪的行为。每次迭代的时间显着增加,这样的增加没有多大意义。
因此,我开始在周期内对函数进行计时,以查看哪个函数花费的时间最多,我发现 parLapply 花费了超过 95% 的时间。因此,我进入了 parLapply 函数并对其计时,以查看函数内部和外部之间的时间是否匹配。他们并没有很大的差距。这个余量随着时间的推移而增加,并且差异可以达到几秒钟,这对算法完成所需的时间产生了很大的影响。
while (condition) {
start.time_1 <- Sys.time()
predictions <- parLapply(cl, array, function(i){
start.time_par <- Sys.time()
#code
end.time <- Sys.time()
time.taken_par<- end.time - start.time_par
print(time.taken_par)
return(value)
})
end.time <- Sys.time()
time.taken <- end.time - start.time_1
print(time.taken)
}
我预计 time.taken 将类似于所有 time.taken_par 的总和。但事实并非如此。所有 time.taken_par 的总和通常为 0.026 秒,而 time.taken 开始时是该值的 4 倍,这很好,但随后会增加到更多(> 5 秒)。
谁能解释发生了什么和/或我认为应该发生的事情是否错误?是内存问题吗?
谢谢您的帮助!
编辑:
的输出parLapply
如下。然而,在我的测试中,有 10 个列表,而不是本例中的 3 个。返回的每个单独列表的大小parLapply
始终相同,在本例中为 25。
[1] 11
[[1]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-0.01878590 -0.03462315 -0.03412670 -0.06016549 -0.02527741 -0.06271799 -0.05429947 -0.02521108 -0.04291305 -0.03145491 -0.08571382 -0.07025075 -0.07704650 0.25301839
15 16 17 18 19 20 21 22 23 24 25
-0.02332236 -0.02521089 -0.01170326 0.41469539 -0.15855689 -0.02548952 -0.02545446 -0.10971302 -0.02521836 -0.09762386 0.02044592
[[2]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-0.01878590 -0.03462315 -0.03412670 -0.06016549 -0.02527741 -0.06271799 -0.05429947 -0.02521108 -0.04291305 -0.03145491 -0.08571382 -0.07025075 -0.07704650 0.25301839
15 16 17 18 19 20 21 22 23 24 25
-0.02332236 -0.02521089 -0.01170326 0.41469539 -0.15855689 -0.02548952 -0.02545446 -0.10971302 -0.02521836 -0.09762386 0.02044592
[[3]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-0.01878590 -0.03462315 -0.03412670 -0.06016549 -0.02527741 -0.06271799 -0.05429947 -0.02521108 -0.04291305 -0.03145491 -0.08571382 -0.07025075 -0.07704650 0.25301839
15 16 17 18 19 20 21 22 23 24 25
-0.02332236 -0.02521089 -0.01170326 0.41469539 -0.15855689 -0.02548952 -0.02545446 -0.10971302 -0.02521836 -0.09762386 0.02044592
编辑2:
好的,我发现了问题所在。我有一个数组,我使用vector("list",10000)
. 在循环的每次迭代中,我都会向这个数组添加一个列表列表。此列表列表的大小为 6656 字节。因此,在 10000 次迭代中,它甚至不等于 0.1Gb。然而,随着这个数组开始填满,并行化的性能开始下降。我不知道为什么会发生这种情况,因为我在具有 64Gb RAM 的机器上运行脚本。这是一个已知问题吗?