Прочитать файл netcdf с многопроцессорной обработкой - PullRequest
0 голосов
/ 04 октября 2018

У меня есть файл netcdf, как показано ниже.Я сделал тест, чтобы прочитать его с помощью многопроцессорной обработки (чтобы чтение могло быть быстрее).

from netCDF4 import Dataset
import multiprocessing

fname = 'testfile.nc'
nc = Dataset(fname, 'w', format='NETCDF4')
data1 = np.random.randn(100, 100, 100)
data2 = np.random.randn(100, 100, 100)
nc.createDimension('x', 100)
nc.createDimension('y', 100)

var1 = nc.createVariable('grid1', np.float, ('x', 'y', 'z'))
var2 = nc.createVariable('grid2', np.float, ('x', 'y', 'z'))

var1[:] = data1
var2[:] = data2

nc.close()

def readnc(fname):
    dataset = Dataset(fname, 'r')
    return dataset['grid1'][:]  


pool = multiprocessing.Pool(processes=2)
a=pool.map(readnc,fname)
pool.close()

Но есть IOERROR:

IOError: [Errno 2] No such file or directory: 'm'

Версии netcdf и netcdf4-python: netCDF 4.6.1, netcdf4-Python 1.4.1.Я не очень хорошо понимаю эту проблему.Если бы кто-то мог объяснить мне, это было бы здорово!Заранее спасибо!

С уважением,

Xiaoni

1 Ответ

0 голосов
/ 08 октября 2018

Я сделал некоторые исправления в вашем коде, так что теперь оно должно работать.Тем не менее, я не уверен, что вы можете ускорить чтение netCDF с помощью кода, подобного следующему ...

#!/usr/bin/env ipython
from netCDF4 import Dataset
import multiprocessing
import numpy as np
import time

fname = 'testfile.nc'
nc = Dataset(fname, 'w', format='NETCDF4')
data1 = np.random.randn(100, 100, 100)
data2 = np.random.randn(100, 100, 100)
nc.createDimension('x', 100)
nc.createDimension('y', 100)
nc.createDimension('z', 100)
var1 = nc.createVariable('grid1', np.float, ('x', 'y', 'z'))
var2 = nc.createVariable('grid2', np.float, ('x', 'y', 'z'))

var1[:] = data1
var2[:] = data2

nc.close()
# -------------------------------------
def readnc(fname):
    #print fname
    dataset = Dataset(fname, 'r')
    return dataset['grid1'][:]  
# -------------------------------------
for itest in range(10):
    pool = multiprocessing.Pool(processes=4)
    tic=time.time();
    a=pool.map(readnc,(fname,))
    print 'Multiprocessing: ',time.time()-tic,'seconds'
    pool.close();
# --------------------------------------
for itest in range(10):
    tic=time.time();
    a=readnc(fname)
    print 'Serial: ',time.time()-tic,'seconds'

Для выполнения части с многопроцессорной обработкой требуется ~ 0,04 секунды, тогда как для последовательной части требуетсяменее 0,01 секунды.У меня такое ощущение, что многопроцессорная часть выполняет 4 процесса с одной и той же задачей - чтение всего набора данных вместо чтения только его частей и выдача одного целого вывода с данными.

...