lapply
在函数或循环中进行垃圾收集的最快方法是什么?对我来说似乎很明显的事情大大减慢了速度。我做错了吗?有更快的方法吗?
x <- 1:10000
system.time(xx <- lapply(1:length(x), function(xi) sum(x[1:xi])))
user system elapsed
0.02 0.00 0.02
system.time(xx <- lapply(1:length(x), function(xi) sum(x[1:xi], invisible(gc(v=FALSE)))))
user system elapsed
22.49 0.00 22.57 # a thousand times increase in time taken!!
在我的实际用例中,该函数有点复杂,并且在没有gc
每个实例之后都会失败。我可以切换到具有更多 RAM 的机器,但会不太方便,所以我很好奇是否有更快的gc
方法可用。
更新根据 Martin Morgan 的建议,稍微重新安排一些事情会使速度接近lapply
没有gc
(现在在不同的机器上工作,这就是为什么时间与上面不同):
x <- 1:10000
system.time(x1 <- lapply(1:length(x), function(xi) sum(x[1:xi])))
user system elapsed
3.47 0.00 3.56
# define a function to make a sequence of a function followed by gc
sum_gc <- function(x) sum(x); invisible(gc(v=FALSE))
system.time(x3 <- lapply(1:length(x), function(xi) sum_gc(x[1:xi])))
user system elapsed
3.52 0.02 3.56