我在计算循环的每次迭代中将计算结果写入NetCDF变量,因为在对变量执行单次写入之前,我无法将所有结果数据保留在内存中。我的假设是每次写入NetCDF变量只会写出我正在编写的数据片段,因此每次写入都会很快,但每次写入似乎需要花费很长时间,我担心整个NetCDF文件正在在每个变量赋值语句中重写,而不仅仅是分配的数据片段,导致非常不必要的I / O开销。
结果数据切片被写入输出NetCDF变量,如下所示:
outputSpi01MonthVariable[totalNumberOfOutputMonths, lat:lat + 1:1, len(lonDimension)] = spiScale01 # a numpy array with compatible shape assigned to the variable at specified indices
是否有更好的方法为输出NetCDF变量赋值,这不会导致如此多的I / O开销?顺便说一下,我已经为输出变量设置了填充,但这似乎没有效果。
答案 0 :(得分:3)
我使用NetCDF4-Python来读/写NetCDF,不,在编写变量或变量块时不会写入整个文件。这是一个完整的例子: http://nbviewer.ipython.org/5764942
答案 1 :(得分:1)
事实证明,在写入输出变量时,变量的方向会产生很大的不同。似乎数据中变化最快的维度(在我的情况下,lat / lon在每次写入变量时都是固定的)应该是正在写入的数组和变量本身的最内层维度。在我的情况下,我将输出的NetCDF变量的维度转换为(lat,lon,time),并且在我的计算的每次迭代中,我编写了数组,其形状为==(1,1,number_of_timesteps),现在写入NetCDF大约快了二十倍:
Original with variable dimensions: [time, lat, lon]
Total time: 0:22:35.852000
Total fill time: 0:00:00.254000
Total SPI compute time: 0:00:53.865000
Total copy time: 0:00:00.099000
Total NetCDF write time: 0:19:15.749000
New code with variable dimensions: [lat, lon, time]
Total time: 0:03:12.249000
Total fill time: 0:00:00.248000
Total SPI compute time: 0:00:53.843000
Total copy time: 0:00:00.083000
Total NetCDF write time: 0:00:46.250000