R的bigmemory中big.matrix和文件backing.big.matrix之间的区别?

时间:2017-08-08 11:05:45

标签: r r-bigmemory

我需要创建一个0和1(大约500K行和20K列)的大文件,我在R中使用了bigmemory包。

现在这对我来说是新的,我还没有找到我的查询的答案。

big1 = big.matrix(nrow=nrow(mm),ncol=nrow(cod),init=0,type="char",dimnames = list(as.character(mm$id),cod$coding),backingfile = "big1.bin", descriptorfile = "big1.desc")

is.filebacked(big1) #TRUE

big2 = filebacked.big.matrix(nrow=nrow(mm),ncol=nrow(cod),init=0,type="char",dimnames = list(as.character(mm$id),cod$coding),backingfile = "big2.bin", descriptorfile = "big2.desc")

## presently the for loop step takes about 2 hours
for (i in 1:nrow(big1)){
    big1[i, match(some_columns)] = 1
  }
}

## eventually writing out the big.matrix to file using write.big.matrix also takes about 2 hours. 

sessionInfo R版本3.3.0 平台:x86_64-pc-linux-gnu(64位) 运行于:Scientific Linux 6.9

这两者有什么区别?我想知道在为big1或big2中的某些单元格分配1时有什么区别?在两种情况下初始化时,这些都保存在后备和描述符文件中吗?或者是否必须做其他事情?

我保存了会话的.RData(在第一个实例中使用没有后备和描述符文件的big1),然后在尝试将其加载到R时导致致命错误并终止会话。所以我想知道我能在这里更有效地加载.RData,而不是每次浪费几个小时来重做一切。

非常感谢。

1 个答案:

答案 0 :(得分:2)

首先,您可以使用big.matrixfilebacked.big.matrix。请参阅函数big.matrix的第一行:

if (!is.null(backingfile)) {
        if (!shared) 
            warning("All filebacked objects are shared.")
        return(filebacked.big.matrix(nrow = nrow, ncol = ncol, 
            type = type, init = init, dimnames = dimnames, separated = separated, 
            backingfile = backingfile, backingpath = backingpath, 
            descriptorfile = descriptorfile, binarydescriptor = binarydescriptor))
    }

因此,如果您提供参数backingfile,则会调用filebacked.big.matrix

其次,作为标准R矩阵,大型矩阵按列存储,如果您关心效率,则应按列访问。像这样:

big1[, some_column_indices] <- 1

第三,对于问题的最后一部分,您不能存储big.matrix对象,因为它是指向C ++对象的外部指针,当您将其加载回内存时,此指针为null并且它使你的会话崩溃。您需要使用描述符(例如,使用并行性时)。关于这个问题至少有3个问题。

希望我回答你的讯问。