【问题标题】:The difference between big.matrix and file backed.big.matrix in R's bigmemory?R 的 bigmemory 中 big.matrix 和文件 backed.big.matrix 的区别?
【发布时间】:2017-08-08 11:05:44
【问题描述】:

我需要创建一个包含 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. 

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

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

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

非常感谢。

【问题讨论】:

  • 如果 0 值多于 1 值,您也可以考虑使用稀疏矩阵表示(例如,参见 Matrix 包)
  • @BenBolker:确实它有更多的 0 值,这就是我最初尝试使用的。但是,在尝试将其转换为 R 内或从其保存输出中的密集矩阵时,我被卡住了。因为我需要密集格式文本文件中的 0 和 1,以便随后用作另一个程序的输入。
  • 这并不完全是微不足道的,但我想说,从长远来看,最好的解决方案是以稀疏格式处理数据,并编写一个函数(可能在 C++/Rcpp 中以提高速度)将结果写入密集格式的文本文件...

标签: r r-bigmemory


【解决方案1】:

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

希望我回答了你的询问。

【讨论】:

  • Prive´:谢谢它确实有帮助。但是,对于分配 1 的部分,每行的列索引都会发生变化,因此 big1[i, some_column_indices] ...除非您暗示其他内容?也许,尝试使用 foreach 函数?此外,与第 1 部分和第 2 部分一起使用时,在分配 1 时,支持/描述符文件是否会更改以合并它?例如,当描述符用于加载新的 R 会话时......这也是我问的,因为我不清楚。
  • 无论如何,如果您希望它快速访问,请尝试按列访问大矩阵。对于描述符,只有将大矩阵重新附加到 R 会话(如果您愿意,重新映射文​​件并重新创建大矩阵对象)才有用。
猜你喜欢
  • 2012-11-27
  • 2015-12-28
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多