使用多处理读取netcdf文件

时间:2018-10-04 10:55:05

标签: multiprocessing python-multiprocessing netcdf4

我有一个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。我对这个问题不太了解。如果有人可以向我解释,那就太好了!预先感谢!

最诚挚的问候,

小艾

1 个答案:

答案 0 :(得分:0)

我在您的代码中做了一些更正,因此现在应该可以正常工作。但是,我不确定您是否可以使用这样的代码来加快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个进程具有相同的任务-读取整个数据集,而不是仅读取其中的一部分,并提供数据的整体输出。