Я сделал некоторые исправления в вашем коде, так что теперь оно должно работать.Тем не менее, я не уверен, что вы можете ускорить чтение 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 процесса с одной и той же задачей - чтение всего набора данных вместо чтения только его частей и выдача одного целого вывода с данными.