我有一个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。我对这个问题不太了解。如果有人可以向我解释,那就太好了!预先感谢!
最诚挚的问候,
小艾
答案 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个进程具有相同的任务-读取整个数据集,而不是仅读取其中的一部分,并提供数据的整体输出。