【问题标题】:Is there a way to create Matrices in R that use less memory than standard matrices?有没有办法在 R 中创建比标准矩阵使用更少内存的矩阵?
【发布时间】:2018-03-10 17:45:21
【问题描述】:

在我的机器上,

m1 = ( runif(5*10^7), ncol=10000, nrow=5000 )

使用大约 380 MB。我需要在内存中同时处理许多这样的矩阵(例如,将它们相加或相乘或在它们上使用 apply 函数)。总而言之,由于内存中存储了多个矩阵,我的代码使用了 4 GB 的 RAM。我正在考虑更有效地存储数据的选项(即以使用更少 RAM 的方式)。

我已经看到R package bigmemory 被推荐。然而:

library(bigmemory)
m2 = big.matrix( init = 0, ncol=10000, nrow=5000 )
m2[1:5000,1:10000] <- runif( 5*10^7 )

使 R 使用的内存量与我使用 Windows 任务管理器验证的内存量大致相同。所以我预计不会有太大的收获,还是我错了,我应该以不同的方式使用big.matrix

【问题讨论】:

  • 不确定它是否适合您的需求,但包 e1071 具有稀疏矩阵功能
  • 在您的第二个代码块中,runif(5*10^7) 会占用您的内存,因此将其分配给 big.matrix 将无济于事。想想你想如何初始化你的矩阵。
  • @Hong Ooi 不清楚 OP 是否使用它来初始化矩阵。他们可能只是将其用作他们正在使用的数据类型的示例。如果这确实具有代表性,则稀疏矩阵不合适。 OP 要么必须处理正在使用的大量内存,要么重写代码以使用硬盘。
  • @Accumulation 确实,我很关心用浮点数填充指定大小的矩阵的问题。使用硬盘驱动器不会比在 RAM 和页面文件中更影响性能吗?
  • 如果你正在做大量的驱动器读取,那将比 RAM 慢,但页面文件只是硬盘驱动器的接口。与普通硬盘访问相比,它旨在减少寻道时间,但如果你有 SSD,我认为这无关紧要。您可以对代码进行计时,看看将内容保存在内存中与进行驱动器交换有多大区别。

标签: r performance matrix memory


【解决方案1】:

使用 bigmemory 包中的文件备份 big.matrix 是一个很好的解决方案。

但是,使用runif( 5*10^7 ) 分配整个矩阵会使您在内存中创建这个大的临时向量。然而,如果你使用gc(reset = TRUE),你会看到这个内存使用消失了。

如果您想逐块初始化矩阵(例如 500 列的块),您可以使用包 bigstatsr。它使用与文件支持的big.matrix(称为FBM)类似的对象,并默认将它们存储在您的临时目录中。你可以这样做:

library(bigstatsr)

m1 <- FBM(1e4, 5e3)

big_apply(m1, a.FUN = function(X, ind) {
  X[, ind] <- runif(nrow(X) * length(ind))
  NULL
}, a.combine = 'c', block.size = 500)

【讨论】:

  • big.matrix 的帮助文件表明使用文件后端可能会影响性能。使用文件后端是否比在 RAM + 页面文件中使用matrix 更有效(后者用于多余的内存)?
  • @tomka 如果对于“页面文件”,您指的是交换,那么这是您可能遇到的最糟糕的情况。当然,如果你有足够的内存,使用标准 R 矩阵将是最快的。但我认为 Filebacked Big Matrices 是一个很好的折衷方案。
【解决方案2】:

解决方案是使用存储在文件中的矩阵,即在调用big.matrix() 函数时将backingfile 设置为不是NULL

【讨论】:

  • 这会比在 RAM + 页面文件中使用 matrix 对性能的影响更小吗?
  • 是的。根据我的经验,使用我的包裹filematrix 会更好,但您的里程可能会有所不同。
【解决方案3】:

根据数据集的构成,sparse.matrix 可能是您前进的最佳方式。这是提高空间和时间效率的一种常见且非常有用的方法。事实上,很多 R 包都要求您使用稀疏矩阵。

【讨论】:

  • 不幸的是,我相信我的数据并不稀疏。矩阵充满了浮点数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多