В xarray - большой набор данных на диске из множества маленьких файлов cdf.

Я новичок в xarray и был бы признателен за помощь в начале моего проекта. Я хотел бы создать один набор данных или диск данных xarray на диске из множества (1000 с) файлов газовой хроматографии - масс-спектрометрии (gcms), по одному на цикл проб. Моя первоначальная цель - просто построить наложения данных из произвольных наборов выборок, каналов масс-зарядки (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). У меня есть тысячи таких файлов, каждый с другим именем образца.

Я изначально предполагал 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)

Как и ожидалось, загрузка нескольких DSI с xr.open_dataset не увеличивает использование памяти процессом python (я смотрю монитор активности на Mac OSX), что хорошо.

Тем не менее, при запуске

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

использование памяти увеличивается до ~70 МБ / сэмпл, указывая на то, что d полностью в памяти, и это не будет масштабироваться до 1000 сэмплов.

Что я могу сделать в xarray, чтобы включить быстрый доступ к набору данных на диске? Это похоже на xr.concat не масштабируемый способ создания огромного файла cdf Возможно, мне нужен способ xr.concat непосредственно на диск или отдельный инструмент для объединения файлов в формате cdf.

1 ответ

Ленивая загрузка Xarray для объединения нескольких файлов netCDF на диск требует использования dask.

Я рекомендую использовать open_mfdataset который заботится о большинстве этих деталей автоматически, например, xr.open_mfdataset('all/my/files/*.nc', concat_dim='sample'),

Другие вопросы по тегам