2012-04-07 6 views
5

G'day、私は種存在/不在記録のために、日付が付いた約125,000の緯度/経度の場所で大規模なデータセットを扱っています。それぞれの場所では、日時の前と3m前の間に各地の気象がどのようなものかを考えたいと思います。これを行うために、私は、データが取られた5年間の間、与えられた気象変数(例えば、最高温度)の毎日の気象データをダウンロードした。私は合計で1,826のラスターファイルを持っています。すべて2〜3MBです。Rでたくさんのデータとたくさんのラスタを扱っていますか?

私はすべてのラスターファイルをスタックし、各ポイントごとにすべてのラスター(1,826)から値を抽出する予定でした。これは、私が必要とする日付を検索するために使用できる膨大なファイルを生成します。しかし、これは多くのラスタをスタックできないため不可能です。私はラスタを500のスタックに分割しようとしましたが、これは動作しますが、生成されるファイルは約1Gbで非常に遅いです(行、125,000、列、500)。また、これらのファイルをすべてRに入れて大きなデータフレームを作成しようとすると、動作しません。

Rでこの量のデータを処理する方法があるかどうか、または私が助けに使うことができるパッケージがあるかどうかを知りたいと思います。 ffのようなパッケージを使用できますか?誰も私がやりたいことをやるために、消費電力の少ない方法を提案していますか?私は礼儀正しい機能のようなものを考えましたが、これまでに一度も使用したことがなく、どこから始めたらいいのか分かりません。

ご協力いただきありがとうございます。事前にお越しいただきありがとうございます。私が現在成功していないコードは、以下の通りです。

敬具、 アダム

library(raster) 
library(rgdal) 
library (maptools) 
library(shapefiles) 

# To create weather data files, first set the working directory to the appropriate location (i.e., maxt) 
# list of raster weather files 
files<- list.files(getwd(), pattern='asc') 
length(files) 

memory.size(4000) 
memory.limit(4000) 

# read in lon/lat data 
X<-read.table(file.choose(), header=TRUE, sep=',') 
SP<- SpatialPoints(cbind(X$lon, X$lat)) 

#separate stacks into mannageable sizes 
s1<- stack(files[1:500]) 
i1 <- extract(s1,SP, cellnumbers = True, layer = 1, nl = 500) 
write.table(i1, file="maxt_vals_all_points_all_dates_1.csv", sep=",", row.names= FALSE, col.names= TRUE) 
rm(s1,i1) 
s2<- stack(files[501:1000]) 
i2 <- extract(s2,SP, cellnumbers = True, layer = 1, nl = 500) 
write.table(i2, file="maxt_vals_all_points_all_dates_2.csv", sep=",", row.names= FALSE, col.names= TRUE) 
rm(s2,i2) 
s3<- stack(files[1001:1500]) 
i3 <- extract(s3,SP, cellnumbers = True, layer = 1, nl = 500) 
write.table(i3, file="maxt_vals_all_points_all_dates_3.csv", sep=",", row.names= FALSE, col.names= TRUE) 
rm(s3,i3) 
s4<- stack(files[1501:1826]) 
i4 <- extract(s4,SP, cellnumbers = True, layer = 1, nl =325) 
write.table(i4, file="maxt_vals_all_points_all_dates_4.csv", sep=",", row.names= FALSE, col.names= TRUE) 
rm(s4,i4) 

# read files back in to bind into final file !!! NOT WORKING FILES ARE TOO BIG!! 
i1<-read.table(file.choose(),header=TRUE,sep=',') 
i2<-read.table(file.choose(),header=TRUE,sep=',') 
i3<-read.table(file.choose(),header=TRUE,sep=',') 
i4<-read.table(file.choose(),header=TRUE,sep=',') 

vals<-data.frame(X, i1, i2, i3 ,i4) 
write.table(vals, file="maxt_master_lookup.csv", sep=",", row.names= FALSE, col.names= TRUE) 
+0

これまで行ってきた膨大なデータのサイズを思い出すことはできませんが、私は幸運にもトンやラスタを名前付きリストに持ってきました。あなたはおそらくあなたの時間のボトルネックになるだろうと分かっているかもしれないので、できるだけその使用を制限しようとします。私はtapply/by/ddplyファミリーの関数を使って大規模なデータフレームをグループに分割し、適切なファイル(それぞれの場合、日付グループ化のようなもの)の各グループに対して抽出を使用してから、再アセンブリしますしかし、私はこれで大成功を収めていません。 – blindjesse

+0

これらのファイルをff配列に読み込み、それらのファイルからポイントの抽出を設定するだけで十分です。あなたは、作業のために1つまたは2つのファイルへのリンクを提供することができますか、コードで有用なデータを生成できますか?また、ファイルを読み込むためにfile.choose()を使用しますが、書き込みに使用した名前はなぜ使用しませんか? – mdsumner

+0

しかし、どうしてもそれらを一度に読んでみるのはなぜですか?なぜ、一度に1つのラスタファイルを抽出するだけではないのですか?また、最終結果が大きすぎて単一オブジェクトとして事前初期化できない場合は、ファイルに追加するだけです。 – mdsumner

答えて

5

私は一度エキス1つのラスタファイルを実行すると、あなたが行くように結果をファイルに追加します。

私は行列のリストを作るのはうんざりですが、ラスターはファイル名や行列(とりわけ)を取ることができ、文字ベクトル上の[[]でインデックスを付けることができます。

files <- list(volcano, volcano * 2, volcano * 3) 
library(sp) 
SP <- SpatialPoints(structure(c(0.455921585146703, 0.237608166502031, 0.397704673508124, 0.678393354622703, 0.342820219769366, 0.554888036966903, 0.777351335399613, 0.654684656824567), .Dim = c(4L, 2L))) 

library(raster) 
for (i in seq_len(length(files))) { 

    r <- raster(files[[i]]) 
    e <- extract(r, SP) 
    ## print(e) ## print for debugging 
    write.table(data.frame(file = i, extract = e),"cellSummary.csv", col.names = i == 1, append = i > 1, sep = ",", row.names = FALSE) 
} 
+0

こんにちは@mdsummer、この答えに感謝します。私はそれが完全に動作することを確信しています。現時点では、ほんの2つの列にdata.frameを作成しています。つまり、いくつかの抽出の後に、書き込む行がなくなります。 私はセル番号を取得するコードを変更する方法を把握しようとしています、そして、それぞれの進行中の列で抽出された情報。私にはあなたのコードはそれを行うべきであると思われます、私は何が間違っているのか分かりません。 もう一度お手伝いをいただき、ありがとうございます。 – Adam

+0

PS。これは私が得るエラーです。 .rasterObjectFromFileのエラー(x、band = band、objecttype = "RasterLayer"、: )このファイルからRasterLayerオブジェクトを作成できません – Adam

+0

ファイルや詳細を指定しないと助けにはなりません。私の想像通りにあなたのファイルがありません。 – mdsumner

0

私は並列処理とセル番号に基づくトリミングの形式を使用しています。この関数は、任意の空間点またはポリゴンを取り、大きなラスタスタックから値を返します。これはコードgood example for large polygonsの変形です。

私のデータの場合、抽出には約350秒、16コアのLinuxサーバーでは32秒かかります。誰かを助けることを願っています!

関連する問題