我试图减少一段我一直在使用的R代码的内存消耗。我正在使用peakRAM()
函数来测量最大的RAM使用量。这是一段很长的代码,其中有一个简单的sapply()
函数在末尾。我发现正是sapply()
部分占用了最多的内存。因此我编写了一个小函数fun1()
模仿对象和sapply()
函数从我的代码中的那个部分,并且如下所示:
library(peakRAM)
fun1 <- function() {
tm <- matrix(1, nrow = 300, ncol = 10) #in the original code, the entries are different and nonzero
print(object.size(tm))
r <- sapply(1:20000, function(i) {
colSums(tm[1:200,]) #in the original code, I am subsetting a 200 length vector which varies with i, stored in a list of length 20000
})
print(object.size(r))
r
}
peakRAM(fun1())
在R中运行此代码,您会看到
peakRAM()
的消耗量约为330Mb。 但是可以看到两个对象 tm
和 r 都非常小(分别为2Kb和1.6Mb),如果查看计算单个 colSums(tm [1:200,])
的 peakRAM()
,则非常小,例如0.1Mb。 因此,在 sapply()
期间,R可能没有在循环变量 1:20000
上处理内存。否则,由于单个 colSums(tm [1:200,])
需要的内存非常小,并且所有相关对象的内存也很小, sapply()
应该只占用少量内存。
在这方面,我已经知道R有一个 gc()
函数,可以在需要时清除不必要的内存,并且可能在 sapply()
期间R未清除内存,这导致了高内存消耗。 如果是这样,请告诉我是否有一种方法可以摆脱这种情况并在不需要这么多额外内存的情况下完成工作? 请注意,我不希望在运行时间上妥协。
tm
替换tm[1:200,]
时,请注意内存使用量显着下降。在没有更多关于您要做什么的信息的情况下,很难说R中是否有一种更有效的方法,但您可以考虑用等效的vapply
调用替换sapply
调用。最终,这样的任务最好在C中进行优化... - Mikael Jagantm
可以大大减少内存使用量,但不幸的是,我需要对我的代码进行子集操作。我有一个长度为 20,000 的列表,其第 i 个元素是长度约为 200 的向量,在sapply()
的第 i 次迭代中,我正在对该向量中的行进行子集操作,而不是示例代码中的 1:200。关于使用 C,您认为在此处实现sapply()
代码的 Rcpp 实现可以解决问题吗? - slowowl