bugfix> r > 投稿

Rに大きな(35000 x 3)マトリックスのリストがあり、それらを単一のマトリックスに結合したいが、約10億行の長さで、Rの最大オブジェクトサイズ。

のビッグメモリー パッケージはより大きな行列を可能にしますが、表示されません  rbind をサポートする複数の行列をまとめます。

小さなマトリックスから非常に大きなマトリックスの作成をサポートする他のパッケージまたは手法はありますか?

また、これを尋ねる前に、これはRAMの問題ではなく、単に64ビットRのRの制限です。

回答 2 件
  • まったくの答えではありませんが、コメント以上のことです:総当たりでそれを行うことはできないと確信していますか? Rには長いベクターがあります(バージョン3.0.0以降、リンクする質問はRバージョン2.14.1を参照しています):このページから、

    Arrays (including matrices) can be based on long vectors provided each of their dimensions is at most 2^31 - 1: thus there are no 1-dimensional long arrays.

    基になる原子ベクトルは最大2 ^ 52 -1の要素になります(「理論的には、現在のCPUとOSのアドレス空間の制限ははるかに小さくなります」)。つまり、原則として ((2^31)-1)/1e9 と同じくらいの行列を作成できるはずです。  = 21億行の長さ。最大の「長い」オブジェクトサイズは約10 ^ 15(つまり、文字通り何百万億)であるため、10億行と3列の行列は(理論的に)問題になりません。

  • ループで実装できます:

    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))
    
    

あなたの答え