R 在函数中写入大型矩阵-快与慢
[经答复后修正的问题] 谢谢你的回复。我的问题不清楚,为此我道歉 我会尽量提供我们情况的更多细节。我们有c。我们保存在一个环境中的100个矩阵。每个都很大。如果可能,我们希望在执行更新时避免复制这些矩阵。我们经常遇到2GB的内存限制,所以这对我们来说非常重要 因此,我们的两个要求是1)避免复制,2)通过名称间接寻址矩阵。速度虽然重要,但却是一个次要问题,可以通过避免复制来解决 在我看来,汤米的解决方案涉及到创建一个副本(尽管它完全回答了我的实际原始问题,所以我是错的) 下面的代码对我们来说是最明显的,但它显然创建了一个副本(如memory.size增加所示)R 在函数中写入大型矩阵-快与慢,r,matrix,R,Matrix,[经答复后修正的问题] 谢谢你的回复。我的问题不清楚,为此我道歉 我会尽量提供我们情况的更多细节。我们有c。我们保存在一个环境中的100个矩阵。每个都很大。如果可能,我们希望在执行更新时避免复制这些矩阵。我们经常遇到2GB的内存限制,所以这对我们来说非常重要 因此,我们的两个要求是1)避免复制,2)通过名称间接寻址矩阵。速度虽然重要,但却是一个次要问题,可以通过避免复制来解决 在我看来,汤米的解决方案涉及到创建一个副本(尽管它完全回答了我的实际原始问题,所以我是错的) 下面的代码对我们来说是最明
myenv好吧,如果你能解释为什么第一个解决方案不好,那就太好了。。。它看起来更整洁,跑得更快
尝试回答以下问题:
“嵌套替换”操作,如foo[bar][baz]最近对“data.table”包所做的更改,专门用于在修改值时避免复制。因此,如果您的应用程序可以为其他操作处理data.tables,那么这可能是一个解决方案。(而且会很快。)FWIW:这个例子可能没问题,但一般来说,最好避免产生缓存或记忆可能会产生明显加速的例子。在这种情况下,很难区分在我们控制范围内的优化和由解释器或硬件完成的事情。
myenv <- new.env()
myenv$testmat1 <- matrix(1.0, nrow=6000, ncol=200)
testfnDirect <- function(paramEnv) {
print(memory.size())
for (i in 1:300) {
temp <- paramEnv$testmat1[10,]
paramEnv$testmat1[10,] <- temp * 0
}
print(memory.size())
}
system.time(testfnDirect(myenv))
myenv <- new.env()
myenv$testmat1 <- matrix(1.0, nrow=6000, ncol=200)
testfnDirect <- function(paramEnv) {
print(gc())
varname <- "testmat1" # unused, but see text
with (paramEnv, {
for (i in 1:300) {
temp <- testmat1[10,]
testmat1[10,] <- temp * 0
}
})
print(gc())
}
system.time(testfnDirect(myenv))
testfnList <- function() {
mylist <- as.list(myenv, all.names=TRUE)
thisvar <- "testmat2"
for (i in 1:300) {
temp <- mylist[[thisvar]][10,]
mylist[[thisvar]][10,] <- temp * 0
}
myenv <<- as.environment(mylist)
}
system.time(testfnList()) # 0.02 secs
thisvar <- match("testmat2", names(mylist))