R数组赋值中的内存使用情况

时间:2014-03-21 01:57:55

标签: arrays r memory

在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。

有谁知道为什么会这样,以及是否有办法绕过这个问题?

1 个答案:

答案 0 :(得分:2)

假设AB是工作区中定义的唯一对象,我希望内存使用量大约增加一倍。这是因为您将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

你可以看到使用的最大内存几乎没有增加。