2

R で bigmemory パッケージを使用した 0 と 1 の大きなファイル (約 500K 行と 20K 列) を作成する必要があります。

これは私にとって初めてのことであり、クエリに対する答えをまだ見つけることができていません。


big1 = big.matrix(nrow=nrow(mm),ncol=nrow(cod),init=0,type="char",dimnames = list(as.character(mm$id),cod$coding),backingfile = "big1.bin", descriptorfile = "big1.desc")

is.filebacked(big1) #TRUE

big2 = filebacked.big.matrix(nrow=nrow(mm),ncol=nrow(cod),init=0,type="char",dimnames = list(as.character(mm$id),cod$coding),backingfile = "big2.bin", descriptorfile = "big2.desc")

## presently the for loop step takes about 2 hours
for (i in 1:nrow(big1)){
    big1[i, match(some_columns)] = 1
  }
}

## eventually writing out the big.matrix to file using write.big.matrix also takes about 2 hours. 

sessionInfo R バージョン 3.3.0 プラットフォーム: x86_64-pc-linux-gnu (64 ビット) 実行環境: Scientific Linux 6.9

これら2つの違いは何ですか?big1 または big2 の一部のセルに 1 を割り当てるときの違いを知りたいですか? どちらの場合も初期化されると、これらはバッキング ファイルと記述子ファイルに保存されますか? それとも何か他のことをしなければなりませんか?

セッションの .RData を保存し (最初のインスタンスでバッキング ファイルと記述子ファイルなしで big1 を使用)、それを R にロードしようとすると、致命的なエラーが発生し、セッションが終了しました。したがって、すべてをやり直すために毎回数時間を無駄にするのではなく、.RData をロードするためにここでより効率的にできることを知りたいと思います。

どうもありがとう。

4

1 に答える 1

2

まず、big.matrixまたはを使用できますfilebacked.big.matrix。関数の最初の行を参照してくださいbig.matrix

if (!is.null(backingfile)) {
        if (!shared) 
            warning("All filebacked objects are shared.")
        return(filebacked.big.matrix(nrow = nrow, ncol = ncol, 
            type = type, init = init, dimnames = dimnames, separated = separated, 
            backingfile = backingfile, backingpath = backingpath, 
            descriptorfile = descriptorfile, binarydescriptor = binarydescriptor))
    }

したがって、引数を指定するとbackingfilefilebacked.big.matrixが呼び出されます。

次に、標準の R 行列と同様に、大きな行列は列単位で格納されるため、効率を重視する場合は列単位でアクセスする必要があります。このようなもの:

big1[, some_column_indices] <- 1

第三に、質問の最後の部分では、オブジェクトを格納できませんbig.matrix。これは、C++ オブジェクトへの外部ポインターであり、メモリにロードすると、このポインターが null になり、セッションがクラッシュするためです。記述子を使用する必要があります (たとえば、並列処理を使用する場合)。SOには、この質問に関する少なくとも3つの質問があります。

私があなたの尋問に答えてくれることを願っています。

于 2017-08-08T13:35:08.117 に答える