将矩阵列表组合成一个big.matrix

时间:2018-05-25 15:30:03

标签: r matrix r-bigmemory

我在R中有一个大型(35000 x 3)矩阵列表,我希望将它们组合成一个矩阵,但它大约有10亿行,超过maximum object size in R

bigmemory包允许使用更大的矩阵,但doesn't appear支持rbind将多个矩阵放在一起。

是否有其他一些包或技术支持从较小的矩阵中创建一个非常大的矩阵?

此外,在您提出这不是RAM问题之前,即使在64位R上也只是R限制。

2 个答案:

答案 0 :(得分:1)

不是一个答案,只是一个评论:你确定你不能通过蛮力做到这一点吗? R现在有很长的向量(从版本3.0.0开始;你链接的问题是指R版本2.14.1):来自this page

  

阵列(包括矩阵)可以基于长向量,只要它们的每个维度最多为2 ^ 31-1:因此没有一维长数组。

虽然基础原子矢量可以达到2 ^ 52 -1个元素("理论上......当前CPU和操作系统的地址空间限制将小得多,#34;)。这意味着你原则上应该能够创建一个长度为((2^31)-1)/1e9 = 21亿行的矩阵;因为最长"长"对象大小约为10 ^ 15(即数字数百亿),10亿行和3列的矩阵应该(理论上)不成问题。

答案 1 :(得分:1)

你可以用循环实现它:

library(bigmemory)

## Reproducible example
mat <- matrix(1, 50e3, 3)
l <- list(mat)
for (i in 2:100) {
  l[[i]] <- mat
}

## Solution
m <- ncol(l[[1]])  ## assuming that all have the same number of columns
n <- sum(sapply(l, nrow))

bm <- big.matrix(n, m)
offset <- 0
for (i in seq_along(l)) {
  mat_i <- l[[i]]
  n_i <- nrow(mat_i)
  ind_i <- seq_len(n_i) + offset
  bm[ind_i, ] <- mat_i
  offset <- offset + n_i
}

## Verif
stopifnot(offset == n, all(bm[, 1] == 1))