R 在函数中写入大型矩阵-快与慢

R 在函数中写入大型矩阵-快与慢,r,matrix,R,Matrix,[经答复后修正的问题] 谢谢你的回复。我的问题不清楚,为此我道歉 我会尽量提供我们情况的更多细节。我们有c。我们保存在一个环境中的100个矩阵。每个都很大。如果可能,我们希望在执行更新时避免复制这些矩阵。我们经常遇到2GB的内存限制,所以这对我们来说非常重要 因此,我们的两个要求是1)避免复制,2)通过名称间接寻址矩阵。速度虽然重要,但却是一个次要问题,可以通过避免复制来解决 在我看来,汤米的解决方案涉及到创建一个副本(尽管它完全回答了我的实际原始问题,所以我是错的) 下面的代码对我们来说是最明

[经答复后修正的问题]

谢谢你的回复。我的问题不清楚,为此我道歉

我会尽量提供我们情况的更多细节。我们有c。我们保存在一个环境中的100个矩阵。每个都很大。如果可能,我们希望在执行更新时避免复制这些矩阵。我们经常遇到2GB的内存限制,所以这对我们来说非常重要

因此,我们的两个要求是1)避免复制,2)通过名称间接寻址矩阵。速度虽然重要,但却是一个次要问题,可以通过避免复制来解决

在我看来,汤米的解决方案涉及到创建一个副本(尽管它完全回答了我的实际原始问题,所以我是错的)

下面的代码对我们来说是最明显的,但它显然创建了一个副本(如memory.size增加所示)


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))