>我有一个 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()
但是有一个IO错误:
IOError: [Errno 2] No such file or directory: 'm'
netcdf 和 netcdf4-python 的版本是:netCDF 4.6.1、netcdf4-Python 1.4.1。我不太了解这个问题。如果有人能向我解释,那就太好了!提前感谢!
此致敬意
小妮
我在您的代码中做了一些更正,所以它现在应该可以工作了。尽管如此,我不确定您是否可以使用这样的代码加快 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 个进程具有相同的任务 - 读取整个数据集,而不是仅读取其中的一部分,并给出一个完整的数据输出。