【发布时间】: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