我在R中有一个列表,在下面的例子中是my_list2
。
我想以最小化RAM使用峰值的方式将项目添加到列表中。
有没有比使用append
函数更有效的内存方式来实现这一点?
我知道最好的做法是创建一个“空”列表,然后按照下面的例子中的my_list2
填充它,但这不是一个选项,因为列表已经存在。
# If I could create the list from scratch I'd do it list this:
my_list <- vector('list', 10)
for (i in 1:10) {
my_list[[i]] <- i
}
# Is there a better way than the 'append' function?
my_list2 <- list(1)
for (i in 2:10) {
my_list2 <- append(my_list2, i)
}
2条答案
按热度按时间xtfmy6hx1#
您可以创建一个临时列表,并在最后只将其追加到
my_list2
一次,而不是在每次迭代中都使用append()
。这对你有用吗?下面是一个
for
循环中5k次迭代的例子:请注意,
bench::mark()
会自动检查两个代码是否给予相同的输出。w8f9ii692#
具有低峰值RAM使用率的实用解决方案如下所示:
您可以使用
gc
来获取内存使用峰值。但是这在很大程度上取决于在执行期间是否存在垃圾收集。要查看可能的最小峰值gctorture
,可以打开,但执行时间通常会慢得多。由于调用方法的顺序可能会影响结果,因此每次都启动一个新的vanilla会话。这里
append
需要8.0 Mb,[[<-
需要8.2 Mb,无论列表大小是否增加。执行相同的操作,但不使用
gctorture
,而是在每一步之后手动使用gc
,得到:这里
append
需要9.9 Mb,[[<-
在不预先调整列表大小的情况下需要10.4 Mb,并且当列表大小增加到9.7 Mb之前时。如果你想知道分配的内存总量,但同时也想知道释放的内存或其他选项,可以看看Monitor memory usage in R。