我是xarray的新手,非常感谢帮助我开始项目。我想从许多(1000s)气相色谱 - 质谱(gcms)文件中创建一个单磁盘xarray数据集或数据帧,每个样本运行一个。我最初的目的是简单地绘制来自任意样本集,质荷载(m / z)通道和保留时间窗口的数据叠加,而xarray的索引和延迟加载似乎是理想的。
我有制造商(奇怪的)cdf格式的数据,每个样本一个文件,并以
格式将每个数据转换为pandas数据帧 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
其中t上升到2100.0秒,列上升到500(所以488 x 18000)。我有1000个这样的文件,每个文件都有不同的样本名称。
我原本设想xr.concat
将它们放入一个巨大的文件中。因此,按照文档,我已经能够从单个样本创建数据集结构并将其保存到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表示质荷比,即15,16 ... 500)
正如预期的那样,使用xr.open_dataset
加载几个dsi并不会增加python进程的内存使用量(我在mac osx上查看活动监视器),这很好。
但是,在运行时
d = xr.concat([ds0, ds1], dim='sample')
内存使用量大约达到70MB /样本,表明d
完全在内存中,这不会扩展到1000个样本。
我可以在xarray中做些什么来快速访问磁盘上的数据集?似乎xr.concat
不是一种可扩展的方法来创建一个巨大的cdf文件。也许我需要一种方法xr.concat
直接到磁盘,或单独的工具来组合cdfs。
答案 0 :(得分:1)
Xarray在磁盘上组合多个netCDF文件的延迟加载需要using dask。
我建议使用open_mfdataset
自动处理大部分细节,例如xr.open_mfdataset('all/my/files/*.nc', concat_dim='sample')
。