我需要创建一个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,而不是每次浪费几个小时来重做一切。
非常感谢。
答案 0 :(得分:2)
首先,您可以使用big.matrix
或filebacked.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个问题。
希望我回答你的讯问。