Python-iris очень медленно выполняет чтение наборов данных netcdf - PullRequest
0 голосов
/ 31 мая 2019

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

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

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))

Кто-то нашел такое же поведение? Что-то не так с радужной оболочкой?

1 Ответ

0 голосов
/ 05 июня 2019

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

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

...