2016-09-29 10 views
0

いくつかのgribファイルにアクセスする必要があります。私はそれを行う方法を、pygribを使用して考え出した。 しかし、私はそれを行う方法を考え出した唯一の方法は辛抱強く遅いです。多くのジブリのメッセージを一度にpygribでアクセスする

私は34年間の3時間のデータを持っていますが、それらは1年に36ファイル(10日ごとに1つずつ)で編成されています。合計で約1000個のファイルがあります。

各ファイルには〜80個の「メッセージ」(10日間の1日あたり8つの値)があります。 (空間データなので、(x、y)次元を持つ)。

私が書くすべての私のデータを読み取るには:

grbfile = pygrib.index(filename, 'shortName', 'typeOfLevel', 'level') 
var1 = grbfile.select(typeOfLevel='pressureFromGroundLayer', level=180, shortName='unknown') 
for it in np.arange(len(var1)): 
    var_values, lat1, lon1 = var1[it].data() 
    if (it==0): 
     tot_var = np.expand_dims(var_values,axis=0) 
    else: 
     tot_var = np.append(tot_var, np.expand_dims(var_values,axis=0),axis=0) 

を1000個のファイルごとにこれを繰り返します。

すみませんがありますか?すべての〜80レイヤーを一度に1つのgribファイルにロードするのが好きですか?

var_values, lat1, lon1 = var1[:].data() 

答えて

1

私が正しく理解していれば、各ファイルのすべての80個のメッセージのデータを1つのアレイに積み重ねる必要があります。

私はなど、あなたのグリッドサイズに応じて、(前に私に起こった)その配列が非常に大きくなります、とnumpyのはMemoryErrorをスローする原因となることが、あなたに警告する必要があり

言われていること、あなたが行うことができます

# substitute with a list of your file names 
# glob is a builtin library that can help accomplish this 
files = list_of_files 

grib = pygrib.open(files[0]) # start with the first one 

# grib message numbering starts at 1 
data, lats, lons = grib.message(1).data() 

# while np.expand_dims works, the following is shorter 
# syntax wise and will accomplish the same thing 
data = data[None,...] # add an empty dimension as axis 0 

for m in xrange(2, grib.messages + 1): 
    data = np.vstack((data, grib.message(m).values[None,...])) 

grib.close() # good practice 

# now data has all the values from each message in the first file stacked up 
# time to stack the rest on there 
for file_ in files[1:]: # all except the first file which we've done 
    grib = pygrib.open(file_) 
    for msg in grib: 
     data = np.vstack((data, msg.values[None,...])) 

    grib.close() 
print data.shape # should be (80 * len(files), nlats, nlons) 

これは、いくつかのスピードを得るかもしれません。 pygrib.openオブジェクトはジェネレータのように動作するので、pygrib.indexselect()メソッドのようなリストを作成する代わりに、それぞれpygrib.gribmessageオブジェクトを渡します。特定のファイルにすべてのメッセージが必要な場合は、これが私がアクセスする方法です。

希望すると助かります!

関連する問題