2016-11-15 7 views
0

私はxarrayを初めて使用しています。私は、1回につき1つのガスクロマトグラフ - 質量分析(gcms)ファイルを多数(1000件)用意して、ディスク上の1つのxarrayデータセットまたはデータフレームを作成したいと考えています。私の最初の目的は、任意のサンプルセット、質量電荷比(m/z)チャンネル、および保持時間ウィンドウからのデータのオーバーレイを単純にプロットすることであり、xarrayのインデックス作成と遅延ロードが理想的です。xarrayでは、多くの小さなcdfsの大きなディスク上のデータセット

私はメーカーの(変な)CDF形式のデータ、サンプルごとに一つのファイルを持っている、と

tは2100.0秒と列に上がる
  t  14  15  16  17  18  19 \ 
0  271.0 102144.0 14864.0 43584.0 25816.0 82624.0 9992.0 
1  271.1 102720.0 15608.0 42896.0 25208.0 82432.0 10024.0 
2  271.2 101184.0 14712.0 42256.0 24960.0 81472.0 9960.0 
3  271.3 101824.0 14704.0 41216.0 25744.0 83008.0 9984.0 
4  271.4 102208.0 14152.0 41336.0 25176.0 81536.0 10256.0 

のような形式でパンダのデータフレームにそれぞれ変換しています500(最大488 x 18000)になります。私は、それぞれ異なるサンプル名のファイルを1000個持っています。

私は最初にxr.concatを1つの巨大なファイルにすることを構想しました。だから、ドキュメント以下、私は単一サンプルからデータセットの構造を作成し、以下のようにCDFに保存することができました:

ds1 = xr.Dataset({'intensity': (['time', 'mz'], c1[["{}".format(x) for x in range(14, 501)]].values)}, 
      coords={'mz': range(14, 501), 
        'time': c1['t'].values, 
        'sample':['c1']}) 
ds1.to_netcdf('test_ds1.nc') 


<xarray.Dataset> 
Dimensions: (mz: 487, smp: 1, time: 18185) 
Coordinates: 
    * time  (time) float64 271.0 271.1 271.2 271.3 271.4 271.5 271.6 ... 
    * mz   (mz) int64 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ... 
    * smp  (smp) <U2 'c1' 
Data variables: 
    intensity (time, mz) float64 1.005e+05 1.444e+04 4.162e+04 2.536e+04 ... 

は(これは、MZは質量電荷比を表します予想通り、いくつかのdsiにxr.open_datasetをロードしても、Pythonプロセスのメモリ使用量は増えません(これはmac osxのアクティビティモニタを参照しています)。これは良いことです。

しかし、

d = xr.concat([ds0, ds1], dim='sample') 

メモリの使用を実行している上dがメモリ内に完全にあり、これは、サンプルの1000に拡張しないことを示し、〜70メガバイト/サンプルをアップ撮影。

ディスク上のデータセットにすばやくアクセスできるようにするには、xarrayで何ができますか? xr.concatは、巨大なcdfファイルを作成するスケーラブルな方法ではないようです。おそらく、私はディスクに直接xr.concatへの道を必要とするか、またはcdfsを結合する別のツールです。

答えて

1

複数のNetCDFファイルをディスクに結合するためのXarrayの遅延読み込みには、using daskが必要です。

xr.open_mfdataset('all/my/files/*.nc', concat_dim='sample')など、これらの詳細のほとんどを自動的に処理するopen_mfdatasetを使用することをおすすめします。

+0

100ファイル用に動作します。 300個のファイルを試してみると、OSError:[Errno 24]開いているファイルが多すぎます。 –

+0

私は、この方法を開いた後、より大きなチャンクに結合すると考えました。 'ds = xr.open_mfdataset(100 files)' 'ds.to_netcdf(bigfile)'しかし、メモリ使用量は急激に急増し始めます。新しいcdfファイルを保存する前にメモリ全体をメモリにロードしなければなりません。 –

+0

「開いているファイルが多すぎます」というエラーは、われわれが知っており、作業中のエラーです。場合によっては、開いているファイルの制限を増やすことができます。残念ながら、scipy netCDFの作者はコアで動作しませんが、他のnetCDFバックエンド(netcdf4-pythonとh5netcdf)は動作しません。 – shoyer

関連する問題