【问题标题】:In xarray, large, on-disk dataset from many small cdfs在 xarray 中,来自许多小型 cdfs 的大型磁盘数据集
【发布时间】:2016-11-17 03:20:17
【问题描述】:

我是 xarray 的新手,希望能在我的项目开始时提供一些帮助。我想从许多(1000个)气相色谱-质谱(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'将它们放入一个巨大的文件中。因此,按照文档,我已经能够从 single 示例创建数据集结构并将其保存到 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。

【问题讨论】:

    标签: python-xarray


    【解决方案1】:

    Xarray 用于合并磁盘上多个 netCDF 文件的延迟加载需要 using dask

    我建议使用open_mfdataset,它会自动处理大部分这些细节,例如xr.open_mfdataset('all/my/files/*.nc', concat_dim='sample')

    【讨论】:

    • 适用于 100 个文件。在尝试 300 个文件时,我得到 OSError: [Errno 24] Too many open files.
    • 我想过以这种方式打开后组合成更大的块,例如ds = xr.open_mfdataset(100 files) ds.to_netcdf(bigfile) 但内存使用量立即开始飙升,因此必须在保存新的 cdf 文件之前尝试将整个内容加载到内存中。
    • Too many open files 错误是我们知道并正在处理的错误。有时您可以增加打开文件的限制。不幸的是,scipy netCDF 编写器不能在核心之外工作,但其他 netCDF 后端(netcdf4-python 和 h5netcdf)可以。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2011-11-28
    相关资源
    最近更新 更多