2016-05-24 4 views
0

Мне нужно читать в больших (+ 15GB) файлах NetCDF в программу, которая содержит трехмерную переменную (и т.д. Время как измерение записи, а данные - широты по долготе).NetCDF Большие данные

Я обработки данных во вложенном цикле 3 уровня (проверка каждого блока NetCDF, если он проходит определенные критерии, например,.

from netCDF4 import Dataset     
import numpy as np 

File = Dataset('Somebigfile.nc', 'r') 
Data = File.variables['Wind'][:] 

Getdimensions = np.shape(Data) 
Time = Getdimensions[0] 
Latdim = Getdimensions[1] 
Longdim = Getdimensions[2] 

for t in range(0,Time): 
    for i in range(0,Latdim): 
     for j in range(0,Longdim): 

      if Data[t,i,j] > Somethreshold: 
       #Do something 

Есть в любом случае я могу прочитать в файле NetCDF один рекорд в то время? Сокращение использования памяти огромно. Любая помощь очень ценится.

Я знаю оператор NCO, но предпочел бы не использовать эти методы, чтобы разбить файлы перед использованием сценария.

+0

решаемые себя; используйте Data = File.variables ['Wind'] [:] внутри цикла. –

ответ

4

Это звучит как вы уже устроились на soluti но я выброшу намного более изящное и векторизованное (скорее всего быстрое) решение, которое использует xarray и dask. Ваш вложенный цикл будет очень неэффективным. Объединяя xarray и dask, вы можете работать с данными в вашем файле поэтапно в полу-векторизованной усадьбе.

Поскольку ваш шаг Do something не является таким специфическим, вам придется экстраполировать его из моего примера.

import xarray as xr 

# xarray will open your file but doesn't load in any data until you ask for it 
# dask handles the chunking and memory management for you 
# chunk size can be optimized for your specific dataset. 
ds = xr.open_dataset('Somebigfile.nc', chunks={'time': 100}) 

# mask out values below the threshold 
da_thresh = ds['Wind'].where(ds['Wind'] > Somethreshold) 

# Now just operate on the values greater than your threshold 
do_something(da_thresh) 

Xarray/DASK документы: http://xarray.pydata.org/en/stable/dask.html

+0

Благодарим вас за ответ. Мое решение не так уж плохо, так как чтение файла netcdf происходит с каждой отметкой времени (первый уровень цикла, а не третий самый внедренный уровень); обработка внутри цикла занимает ~ 30 секунд, так что лишняя глава 1 с чтения с диска и памяти не слишком болезненна. Однако большое предложение выглядит намного более эффективным. –

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