big.matrix 和 file backed.big.matrix 在 R 的 bigmemory 中的区别?

The difference between big.matrix and file backed.big.matrix in R's bigmemory?

我需要创建一个由 0 和 1 组成的大文件(大约 50 万行和 2 万列),为此我使用了 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. 

会话信息 R 版本 3.3.0 平台:x86_64-pc-linux-gnu(64 位) 运行 下:科学 Linux 6.9

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

我已经保存了会话的 .RData(首先使用没有支持和描述符文件的 big1),然后在尝试将其加载到 R 中时它导致了致命错误并终止了会话。所以我想知道我可以在这里更有效地加载 .RData,而不是每次都浪费几个小时来重做所有事情。

非常感谢。

首先,您可以使用 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++ 对象的外部指针,当您将其加载回内存时,该指针为空它会让你的会话崩溃。您需要使用描述符(例如,在使用并行性时)。 SO上至少有3个问题是关于这个问题的。

希望我回答了你的问题。