对于非常宽的矩阵,R bigmemory attach.big.matrix非常慢

时间:2013-10-01 18:50:56

标签: r matrix bigdata r-bigmemory

我正在使用bigmemory包与R中的大型矩阵进行交互。这对于大型矩阵很有效,除了重新加载用attach.big.matrix()创建的二进制文件的read.big.matrix()函数比原始文件慢很多致电read.big.matrix()。这是一个例子:

library(bigmemory)

# Create large matrix with 1,000,000 columns
X = matrix(rnorm(1e8), ncol=1000000)

colnames(X) = paste("col", 1:ncol(X))
rownames(X) = paste("row", 1:nrow(X))

# Write to file
write.big.matrix(as.big.matrix(X), "X.txt", row.names=TRUE, col.names=TRUE)

# read into big.matrix and create backing-file for faster loading the second time
A = read.big.matrix("X.txt", header=TRUE, has.row.names=TRUE, type="double", backingfile="X.bin", descriptorfile="X.desc")

# Attach the data based on the backing-file 
G = attach.big.matrix("X.desc")

当列数较小(即1000)时,代码按预期工作,attach.big.matrix()read.big.matrix()快。但是有1,000,000列,attach.big.matrix()慢了10倍!

另外,请注意,当没有列名称(即注释掉colnames(X)行)并且我可以在零时间附加时,此性能问题就完全消失了。这个瓶颈正在解析X.desc的建议,应该有更好的attach.big.matrix()方式。

与我的真实数据相比,这个矩阵很小。

或者我可以做些不同的事情吗?

由于

系统信息:

Intel Xeon E5-2687W @ 3.10GHz,64 Gb RAM

Ubuntu 12.04.2 LTS

R 3.0.1

bigmemory_4.4.3

1 个答案:

答案 0 :(得分:0)

从包user manual

  

如果x有大量的行和/或列,那么使用rownames和/或colnames将   是非常记忆密集的,应该避免。

正如您建议的那样,当您避免使用列名时,性能问题就会消失。在我的情况下,我通过将列名保持在一个单独的向量来解决这个问题,我用它来提取我需要的列的索引。