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

Posted

技术标签:

【中文标题】R bigmemory attach.big.matrix 对于非常宽的矩阵来说非常慢【英文标题】:R bigmemory attach.big.matrix is very slow for very wide matrices 【发布时间】:2013-10-01 18:50:55 【问题描述】:

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

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】:

来自包user manual

如果 x 有大量的行和/或列,那么使用行名和/或列名将 非常占用内存,应该避免。

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

【讨论】:

以上是关于R bigmemory attach.big.matrix 对于非常宽的矩阵来说非常慢的主要内容,如果未能解决你的问题,请参考以下文章

R bigmemory 不会读取大的 csv 文件

无法在 R 2.15.2 Windows 中安装 bigmemory 库

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

如何在 Windows 操作系统上安装 BigMemory 和 bigrf

在 R 中计算大矩阵的零空间

如何释放崩溃 R 会话的 big.matrix 对象使用的内存