2

我在计算循环的每次迭代中将计算结果写入 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 开销?顺便说一句,我已将输出变量的填充设置为关闭,但这似乎没有效果。

4

2 回答 2

3

我使用 NetCDF4-Python读取/写入 NetCDF,不,当您写入变量或变量块时,不会写入整个文件。这是一个完整的例子: http: //nbviewer.ipython.org/5764942

于 2013-06-12T12:50:41.467 回答
1

事实证明,在写入输出变量时,变量的方向有很大的不同。似乎数据变化最快的维度(在我的情况下,纬度/经度在每次写入变量时都是固定的)应该是正在写入的数组和变量本身的最内层维度。在我的例子中,我将输出 NetCDF 变量的维度转换为(纬度,经度,时间),并且在每次计算迭代时,我编写了形状 == (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
于 2013-06-12T15:45:53.420 回答