Nel*_*ell 10 memory r agent-based-modeling
我正在用R构建基于代理的模型,但是尝试使用大对象却遇到了内存问题。特别地,在初始化时创建8个3D阵列,并且在每个时间步骤中,每个3D阵列都由不同的功能填充。
目前,反导系统运行了1825天,模拟了2500个人在整个景观中移动。风景中有1000个单元格。使用此配置,我没有内存问题。
在初始化时
1个3D阵列类似于:
h <- array(NA, dim=c(1825, 48, 2500),
dimnames=list(NULL, NULL, as.character(seq(1, 2500, 1))))
## 3th dimension = individual ID
Run Code Online (Sandbox Code Playgroud)1个3D阵列类似于:
p <- array(NA, dim=c(1825, 38, 1000),
dimnames=list(NULL, NULL, as.character(seq(1, 1000, 1))))
## 3th dimension = cell ID
Run Code Online (Sandbox Code Playgroud)6个3D阵列如下:
t <- array(NA, dim=c(1825, 41, 2500),
dimnames=list(NULL, NULL, as.character(seq(1, 2500, 1))))
## 3th dimension = individual ID
Run Code Online (Sandbox Code Playgroud)数组包含字符/字符串数据类型。
理想情况下,我想增加个人数量和/或补丁数量,但是由于内存问题,这是不可能的。似乎有一些可用的工具,例如bigmemory
,gc
来管理内存。这些工具有效吗?我是编程的初学者,没有管理内存和高性能计算的经验。任何建议都将不胜感激,感谢您的宝贵时间。
sessionInfo()R版本3.5.3(2019-03-11)平台:x86_64-w64-mingw32 / x64(64位)运行于:Windows 7 x64(内部版本7601)Service Pack 1
根据我的理解,bigmemory
仅适用于矩阵而不是多维数组,但您可以将多维数组保存为矩阵列表。
gc
只是垃圾收集器,您实际上不必调用它,因为它会自动调用,但手册还指出:
在删除大对象后调用 gc 会很有用,因为这可能会提示 R 将内存返回给操作系统。
我认为对您的任务最有用的包是ff
. 这里有一个简短的例子来说明该包的强度ff
,它将数据存储在磁盘上,几乎不影响内存。
使用 base-R 初始化数组:
p <- array(NA, dim=c(1825, 38, 1000),
dimnames=list(NULL, NULL, as.character(seq(1, 1000, 1))))
format(object.size(p), units="Mb")
Run Code Online (Sandbox Code Playgroud)
“264.6 MB”
因此,总的来说,您的初始数组将占用几乎 5GB 内存,这会给您带来繁重计算的麻烦。
使用 ff 初始化数组:
library(ff)
myArr <- ff(NA, dim=c(1825, 38, 1000),
dimnames=list(NULL, NULL, as.character(seq(1, 1000, 1))),
filename="arr.ffd", vmode="logical", overwrite = T)
format(object.size(myArr), units="Mb")
Run Code Online (Sandbox Code Playgroud)
[1]“0.1MB”
测试相等性:
euqals <- list()
for (i in 1:dim(p)[1]) {
euqals[[i]] <- all.equal(p[i,,],
myArr[i,,])
}
all(unlist(euqals))
Run Code Online (Sandbox Code Playgroud)
[1] 正确
归档时间: |
|
查看次数: |
270 次 |
最近记录: |