2016-05-24 22 views
0

大容量(+ 15GB)のNetCDFファイルを3D変数(時間はレコード次元として、データは経度で緯度)を保持するプログラムに読み込む必要があります。NetCDF大きなデータ

私はそれが一定の基準に合格した場合のNetCDFの各ブロックをチェックする(3レベルのネストされたループ内のデータを処理しています例えば、。

from netCDF4 import Dataset     
import numpy as np 

File = Dataset('Somebigfile.nc', 'r') 
Data = File.variables['Wind'][:] 

Getdimensions = np.shape(Data) 
Time = Getdimensions[0] 
Latdim = Getdimensions[1] 
Longdim = Getdimensions[2] 

for t in range(0,Time): 
    for i in range(0,Latdim): 
     for j in range(0,Longdim): 

      if Data[t,i,j] > Somethreshold: 
       #Do something 

私はnetCDFファイルに読み込むことができるとにかくあり一度に1時間記録?巨大メモリ使用量を削減する。すべてのヘルプ巨大に感謝。

私はNCO事業者を知っていますが、スクリプトを使用する前に、ファイルを分割するためにこれらのメソッドを使用しないことを好むだろう。

+0

は自分自身を解決しました。ループ内でData = File.variables ['Wind'] [:]を使用します。 –

答えて

4

ですねあなたがすでにソルティに定住しているようにしかし、私はxarraydaskを使用するはるかにエレガントでベクトル化された(おそらく速い)ソリューションを投げ捨てます。ネストされたforループは非常に非効率的になります。 xarraydaskを組み合わせることで、ファイル内のデータを半ベクトル化されたマナーで段階的に処理できます。

あなたのDo somethingの手順はそれほど具体的ではないので、私の例から推測する必要があります。

import xarray as xr 

# xarray will open your file but doesn't load in any data until you ask for it 
# dask handles the chunking and memory management for you 
# chunk size can be optimized for your specific dataset. 
ds = xr.open_dataset('Somebigfile.nc', chunks={'time': 100}) 

# mask out values below the threshold 
da_thresh = ds['Wind'].where(ds['Wind'] > Somethreshold) 

# Now just operate on the values greater than your threshold 
do_something(da_thresh) 

Xarray/DASKのドキュメント:http://xarray.pydata.org/en/stable/dask.html

+0

ありがとうございます。 netcdfファイルの読み込みがすべてのタイムステップ(ループの最初のレベルで、3番目に埋め込まれたレベルではありません)で発生するので、私の解決策はそれほど悪くありません。ループ内の処理には30秒かかります。そのため、ディスクとメモリの1秒間の読み込みは余りにも苦痛ではありません。しかし、大きな示唆は、はるかに効率的に見えます。 –

関連する問題