在我當前的項目中,我有一個計算函數,它在向量A的一個元素上運行,並返回一個列表元素,我將其插入到列表B中。返回元素包含許多與第一個列表相關的任意大小的矩陣。如何以內存有效的方式將結果保存在列表中?
作爲一個例子,我們來看一個函數,它取一個原始數n並生成一個n×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文件中來實現此目的,但我希望有人有更優雅的解決方案。
FF包看起來像這個 http://cran.r-project.org/web/packages/ff/ff.pdf 有趣的可能性,但據我所知它不支持列表對象。
注意事項:
- 我使用了一個for循環,因爲我希望能夠修復的第七千迭代中出現的錯誤,而無需重新運行不必要的第6999次迭代。
- 根據您的機器編輯代碼的參數,直到它可以運行,但只能在您的計算機上緩慢運行。
- 我有一個列表作爲其輸入的實際問題,所以我對向量化任意矩陣函數不感興趣。
- 內存問題在我的實際問題中複雜化,因爲函數使用大量內存(它涉及數據框的子集)。
編輯:我正在考慮將r對象映射到臨時文件的mmap包,但我仍試圖解決如何使用它解決此問題。
請不要在標題中放置標籤_redundant_。 –
如果再次訪問列表中的任何元素,是否有任何需要將其放入列表中? – James
稍後它將被不同的R程序訪問,但是對於該過程的這一步它只需要被計算和存儲。 –