2

我需要创建一个包含 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-bit) 运行于:Scientific Linux 6.9

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

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

非常感谢。

4

1 回答 1

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

所以,如果你提供一个参数backingfilefilebacked.big.matrix将会被调用。

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

big1[, some_column_indices] <- 1

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

希望我回答了你的询问。

于 2017-08-08T13:35:08.117 回答