在Linux和Windows环境中使用R时遇到以下问题。在最简单的形式中,我有一个3或4维数组,我逐渐使用较小的数组填充。
A <- array(NA, dim=c(500, 1000,1000))
B <- array(rnorm(1e4), dim=c(1000,1000))
for (i in 1:500) A[i,,] <- B
有趣的是,即使A确实被分配,当循环开始时,内存使用率会上升,直到工作站变得无法使用。对于上下文,当A为2000x2000x400时,第三行的执行可以快速填满24GB的RAM。
有谁知道为什么会这样,以及是否有办法绕过这个问题?
答案 0 :(得分:2)
假设A
和B
是工作区中定义的唯一对象,我希望内存使用量大约增加一倍。这是因为您将A
初始化为逻辑数组(默认情况下NA
是逻辑的),第一个子集赋值会将其转换为数字。
> A <- array(NA, dim=c(500, 1000,1000))
> str(A)
logi [1:500, 1:1000, 1:1000] NA NA NA NA NA NA ...
> A[1,,] <- B
> str(A)
num [1:500, 1:1000, 1:1000] -1.21 NA NA NA NA NA NA NA NA NA ...
请改为尝试:
A <- array(NA_real_, dim=c(500, 1000,1000))
B <- array(rnorm(1e4), dim=c(1000,1000))
gc()
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 185801 10.0 407500 21.8 350000 18.7
# Vcells 501281866 3824.5 551897808 4210.7 501612188 3827.0
for (i in 1:500) A[i,,] <- B
gc()
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 185809 10.0 407500 21.8 350000 18.7
# Vcells 501281867 3824.5 579572698 4421.8 502108245 3830.8
你可以看到使用的最大内存几乎没有增加。