在我当前的项目中,我有一个计算函数,它在向量 A 的一个元素上运行并返回一个列表元素,我插入到列表 B 中。返回元素包含许多与第一个列表相关的任意大小的大型矩阵。
作为一个例子,让我们以一个函数为例,它接受一个原始数字 n 并生成一个 nx n 的随机矩阵。
vector.A <- sample(1:2000, 15000, replace = TRUE)
list.B <- as.list(rep(NA, length(vector.A)))
arbitraryMatrix <- function(n) {
matrix(rnorm(n*n), ncol = n, nrow = n)
}
for ( i in which(is.na(list.B)) ) {
print(i)
list.B[[i]] <- arbitraryMatrix( vector.A[i] )
}
这个函数减慢了更大的 list.B 获取速度(事实上我很确定它会在 R 完成循环之前崩溃)。在我看来,list.B 的任何元素在创建后都不会被再次访问,因此它可以写入磁盘而不是以减慢计算速度的方式占用内存。
我可以编写一个脚本,通过将块保存到 .rda 文件中来做到这一点,但我希望有人有一个更优雅的解决方案。
对于这个http://cran.r-project.org/web/packages/ff/ff.pdf,FF包看起来是一个有趣的可能性, 但据我所知,它不支持列表对象。
注意事项:
- 我正在使用 for 循环,因为我希望能够修复第 7000 次迭代中出现的错误,而不必不必要地重新运行前 6999 次迭代。
- 根据您的机器编辑代码的参数,直到它可以运行但只能在您的
计算机上缓慢运行。 - 我遇到的实际问题是将列表作为输入,因此我对将任意矩阵函数向量化不感兴趣。
- 内存问题在我的实际问题中更加复杂,因为该函数使用大量内存(它涉及子集数据帧)。
编辑:我正在考虑将 r 对象映射到临时文件的 mmap 包,但我仍在尝试解决如何使用它来解决这个问题。