5

私は巨大なデータセットに取り組んでおり、テスト統計の分布を導出したいと考えています。したがって、巨大な行列 (200000x200000) で計算を行う必要があり、ご想像のとおり、メモリの問題があります。より正確には、次のようになります。 エラー: サイズのベクトルを割り当てられません ... Gb。私は 64 ビット版の R を使用しており、RAM は 8Gb です。パッケージ bigmemory を使用しようとしましたが、大きな成功はありませんでした。

最初の問題は、距離行列を計算する必要がある場合です。データフレームの列の距離を並列に計算する Dist という amap パッケージでこの素晴らしい関数を見つけましたが、うまく機能しますが、下/上三角が生成されます。行列の乗算を実行するには距離行列が必要ですが、残念ながら行列の半分ではできません。as.matrix 関数を使用していっぱいにすると、再びメモリの問題が発生します。

だから私の質問は、 as.matrix ステップをスキップして dist オブジェクトを big.matrix に変換する方法です。Rccp に関する質問かもしれませんが、私は Rccp の初心者であることを覚えておいてください。

事前にサンクス!

4

1 に答える 1

1

"dist" オブジェクトを "(big.)matrix" に変換する場合: 大きな中間オブジェクトを作成する、、および演算子のstats:::as.matrix.dist呼び出しがあります。これらを回避するには、他の代替手段の中でも、次のようなものを使用できます。rowcolt

データあり:

nr = 1e4
m = matrix(runif(nr), nr, 10)
d = dist(m)

次に、ゆっくりと、「マトリックス」を割り当てて埋めます。

#as.matrix(d) #this gives error on my machine
n = attr(d, "Size")
md = matrix(0, n, n) 
id = cumsum(c(1L, (n - 1L) - 0:(n - 2L))) #to split "d"
for(j in 1:(n - 1L)) {
    i = (j + 1L):n
    md[i, j] = md[j, i] = d[id[j]:(id[j] + (n - (j + 1L)))]
}

(「md」をbig.matrix(n, n, init = 0)均等に割り当てるとうまくいくようです)

md[2:5, 1]
#[1] 2.64625973 2.01071637 0.09207748 0.09346157
d[1:4]
#[1] 2.64625973 2.01071637 0.09207748 0.09346157

より小さい「nr」を使用してテストできます。

all.equal(as.matrix(md), as.matrix(d), check.attributes = FALSE)
#[1] TRUE
于 2016-02-18T18:06:18.580 に答える