tl;dr: raster::sampleRandom に時間がかかるのはなぜですか? たとえば、30k セルから 3k セルを抽出する (10k タイムステップ以上)。状況を改善するために私にできることはありますか?
編集:下部の回避策。
大きなファイル (通常は 2 ~ 3 GB 以上) を読み取り、データに対して変位値計算を実行する必要がある R スクリプトを考えてみましょう。ラスター パッケージを使用して ( netCDF
) ファイルを読み取ります。私は 64 ビット GNU/Linux で R 3.1.2 を使用しています。RAM は 4GB で、ほとんどの場合 3.5GB が使用可能です。
多くの場合、ファイルは大きすぎてメモリに収まらないため (何らかの理由で 2GB のファイルでさえ、3GB の利用可能なメモリに収まりません:)unable to allocate vector of size 2GB
私は常にこれを行うことはできません。
pr <- brick(filename[i], varname=var[i], na.rm=T)
qs <- quantile(getValues(pr)*gain[i], probs=qprobs, na.rm=T, type=8, names=F)
sampleRaster()
しかし、代わりに、raster
パッケージの関数を使用してファイル内の少数のセルをサンプリングし、良好な統計を得ることができます。
例えば:
pr <- brick(filename[i], varname=var[i], na.rm=T)
qs <- quantile(sampleRandom(pr, cnsample)*gain[i], probs=qprobs, na.rm=T, type=8, names=F)
私はこれを 6 つの異なるファイル ( i
1 から 6 まで) に対して実行します。これらのファイルはすべて約 30k のセルと 10k のタイムステップ (つまり 300M の値) を持っています。ファイルは次のとおりです。
- 1.4GB、1変数、ファイルシステム1
- 2.7GB、2 つの変数、つまり、私が読み取った変数、ファイルシステム 2 に約 1.35GB
- 2.7GB、2 つの変数、つまり、私が読み取った変数、ファイルシステム 2 に約 1.35GB
- 2.7GB、2 つの変数、つまり、私が読み取った変数、ファイルシステム 2 に約 1.35GB
- 1.2GB、1変数、ファイルシステム3
- 1.2GB、1変数、ファイルシステム3
ご了承ください:
- ファイルは 3 つの異なる nfs ファイルシステムにあり、そのパフォーマンスはよくわかりません。nfs ファイルシステムのパフォーマンスが刻一刻と大きく変化する可能性があるという事実を排除することはできません。
- スクリプトの実行中、RAM の使用率は常に 100% ですが、システムはすべてのスワップを使用しているわけではありません。
sampleRandom(dataset, N)
1 つのレイヤー (= 1 タイムステップ) から N 個の非 NA ランダム セルを取得し、その内容を読み取ります。各層の同じ N 個のセルに対してそうします。Z をタイムステップとして、データセットを 3D マトリックスとして視覚化する場合、関数は N 個のランダムな非 NA 列を取ります。ただし、関数はすべてのレイヤーの NA が同じ位置にあることを認識していないため、選択した列に NA が含まれていないことを確認する必要があります。- 8393 個のセル (合計で約 340MB) を含むファイルに対して同じコマンドを使用し、すべてのセルを読み取る場合、計算時間は、30k セルを含むファイルから 1000 個のセルを読み取ろうとする場合の何分の一かです。
以下の出力を生成する完全なスクリプトは、コメントなどとともに ここにあります。
30k セルをすべて読み取ろうとすると、次のようになります。
cannot allocate vector of size 2.6 Gb
1000 個のセルを読み取った場合:
- 5分
- 45メートル
- 30メートル
- 30メートル
- 20メートル
- 20メートル
3000 個のセルを読み取った場合:
- 15分
- 18メートル
- 35メートル
- 34メートル
- 60メートル
- 60メートル
5000 個のセルを読み取ろうとすると、次のようになります。
- 2.5時間
- 22時間
- 2 人以上の場合、18 時間後に作業を中断しなければならず、ワークステーションを他のタスクに使用する必要がありました
より多くのテストで、分位点の計算ではなく、ほとんどの計算時間を取っているのは関数であることがわかりましたsampleRandom()
(これは、 などの他の分位点関数を使用して高速化できますkuantile()
)。
- なぜそんなに
sampleRandom()
時間がかかるのですか?なぜこれほど奇妙に、時には速く、時には非常に遅く動作するのでしょうか? - 最善の回避策は何ですか?
raster::extract
最初のレイヤーに N 個のランダム セルを手動で生成し、次にすべてのタイム ステップを手動で生成できると思います。
編集:回避策は次のとおりです。
cells <- sampleRandom(pr[[1]], cnsample, cells=T) #Extract cnsample random cells from the first layer, exluding NAs
cells[,1]
prvals <- pr[cells[,1]] #Read those cells from all layers
qs <- quantile(prvals, probs=qprobs, na.rm=T, type=8, names=F) #Compute quantile
すべてのレイヤーの NA が同じ位置にあるため、これは機能し、非常に高速です。これは実装できるオプションであるべきだと思いますsampleRandom()
。