2015-12-08 5 views
3

Мне нужно иметь возможность быстро считывать множество переменных netCDF в python (1 переменная на файл). Я обнаружил, что функция Dataset в библиотеке netCDF4 довольно медленная по сравнению с чтением служебных программ на других языках (например, IDL).Эффективное чтение переменной netcdf в python

Мои переменные имеют форму (2600,5200) и тип float. Они мне кажутся не такими большими (filesize = 52Mb).

Вот мой код:

import numpy as np 
from netCDF4 import Dataset 
import time 
file = '20151120-235839.netcdf' 
t0=time.time() 
openFile = Dataset(file,'r') 
raw_data = openFile.variables['MergedReflectivityQCComposite'] 
data = np.copy(raw_data) 
openFile.close() 
print time.time-t0 

занимает около 3 секунд, чтобы прочитать одну переменную (один файл). Я думаю, что основным замедлением является np.copy. raw_data - <type 'netCDF4.Variable'>, при этом копия. Это лучший/самый быстрый способ чтения netCDF в python?

Спасибо.

+2

Сила Numpy является то, что вы можете создать представления в покидающих данных в памяти через метаданные, которые он сохраняет о данных. Таким образом, копия всегда будет медленнее, чем представление, через указатели. Поскольку @JCOidl говорит, что непонятно, почему вы не просто используете raw_data = openFile.variables ['MergedReflectivityQCComposite'] [:] –

+0

Этот простой шаг ускоряет чтение на порядок. Спасибо! Я попытаюсь использовать указатели с помощью Numpy. Знаете ли вы о хорошей ссылке, объясняющей эту концепцию немного больше (n00b здесь)? –

+0

Документы: https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#copies-and-views и на SO http://stackoverflow.com/questions/4370745/view-onto- a-numpy-array –

ответ

2

Я не уверен, что сказать о операции np.copy (которая действительно медленная), но я обнаружил, что модуль PyNIO от UCAR хорошо работает как для файлов NetCDF, так и для HDF. Это место data в Numpy массив:

import Nio 

f = Nio.open_file(file, format="netcdf") 
data = f.variables['MergedReflectivityQCComposite'][:] 
f.close() 

Тестирование кода в сравнении с кодом PyNIO на файл ndfCDF я привел в 1,1 секунды для PyNIO, по сравнению с 3,1 секунды для модуля netCDF4. Ваши результаты могут отличаться; Стоит посмотреть, хотя.

3

Сила Numpy заключается в том, что вы можете создавать представления в выходящие данные в памяти через метаданные, которые она хранит о данных. Таким образом, копия всегда будет медленнее, чем представление, через указатели. Как JCOidl говорит, что не понятно, почему вы не просто использовать:

raw_data = openFile.variables['MergedReflectivityQCComposite'][:] 

Для получения дополнительной информации см Numpy Tutorial и SO View onto a numpy array?

Смежные вопросы