Python-iris работает очень медленно при чтении наборов данных netcdf

Недавно я переключился с netcdf4 на iris для чтения файлов netcdf в Python (я использую Python 2.7). Во многих отношениях это улучшило мой код, но у меня возникли проблемы с производительностью некоторых наборов данных. Чтение некоторых файлов (не всех) раньше занимало всего несколько секунд с netcdf4 и одну или несколько минут с iris.

Это простой тест, который я использовал. Первое чтение занимает 4 секунды с netcdf4 и около 90 секунд с iris! Это значительно ухудшает производительность моего кода, так как я обычно читаю много файлов за один прогон.

from datetime import datetime
import iris
import netCDF4 as nc

nr = 3
ifile = 'myfile.nc'

print('IRIS read\n')
for i in range(nr):
    t1 = datetime.now()
    fh = iris.load(ifile)
    data = fh[0].data
    t2 = datetime.now()

    diff = (t2-t1).total_seconds()
    print('Data loaded in {:8.3f} s\n'.format(diff))

print('NetCDF read\n')
for i in range(nr):
    t1 = datetime.now()
    fh = nc.Dataset(ifile, mode='r')
    data = fh.variables.values()[-1][:]
    t2 = datetime.now()

    diff = (t2-t1).total_seconds()
    print('Data loaded in {:8.3f} s\n'.format(diff))

Кто-то нашел такое же поведение? Я что-то не так делаю с ирисом?


person fedef    schedule 31.05.2019    source источник
comment
Насколько я понимаю, вызов .data в кубе радужной оболочки немедленно загрузит данные в массив numpy. Для netcdf вы получаете только объект переменной netcdf из файла variable-dict. Вам нужно будет скопировать данные в массив numpy, добавив [:].   -  person kmuehlbauer    schedule 31.05.2019
comment
вы правы, я отредактировал пример выше. В любом случае netcdf4 занимает столько же времени, если я добавляю [:], так что проблема в этом.   -  person fedef    schedule 31.05.2019
comment
Тогда я могу только предположить, что данные, которые вы запрашиваете с помощью iris (индекс 0), отличаются от переменной, полученной с помощью netcdf4 (индекс -1).   -  person kmuehlbauer    schedule 31.05.2019
comment
Я могу заверить вас, что это одна и та же переменная. Файлы в примере имеют только одну переменную, но netcdf4 также считывает координаты как переменные (последняя переменная является истинной). Суть в том, что Айрис делает в это время?   -  person fedef    schedule 02.06.2019


Ответы (1)


Следует иметь в виду, что в данном случае iris действительно выполняет намного больше работы, чем netCDF4. Это связано с тем, что он знает о соглашениях CF и автоматически определяет координаты (как размерные, так и вспомогательные) и считывает множество метаданных из файла для создания красивого куба, который дает вам не только голые данные, но и дает вам возможность на самом деле понять это.

В результате содержимое fh в случае iris совсем не такое, как в случае netCDF4. Когда я запустил вашу программу на тестовом файле и напечатал data в обоих случаях, чистый netCDF4 фактически предоставил некоторые координатные данные (1d широты в моем случае), а не фактические данные вообще.

person zklaus    schedule 05.06.2019