【问题标题】:Efficient reading of netcdf variable in pythonpython中netcdf变量的高效读取
【发布时间】:2016-03-13 14:25:18
【问题描述】:

我需要能够在 python 中快速读取大量 netCDF 变量(每个文件 1 个变量)。我发现 netCDF4 库中的 Dataset 函数与读取其他语言(例如 IDL)的实用程序相比相当慢。

我的变量的形状为 (2600,5200),类型为 float。它们对我来说似乎并不大(文件大小 = 52Mb)。

这是我的代码:

import numpy as np
from netCDF4 import Dataset
import time
file = '20151120-235839.netcdf'
t0=time.time()
openFile = Dataset(file,'r')
raw_data = openFile.variables['MergedReflectivityQCComposite']
data = np.copy(raw_data)
openFile.close()
print time.time-t0

读取一个变量(一个文件)大约需要 3 秒。我认为主要的放缓是 np.copy。 raw_data<type 'netCDF4.Variable'>,因此是副本。这是在 python 中进行 netCDF 读取的最佳/最快方法吗?

谢谢。

【问题讨论】:

  • Numpy 的强大之处在于,您可以通过它保留的有关数据的元数据创建对内存中现有数据的视图。因此,通过指针,副本总是比视图慢。正如@JCOidl 所说,尚不清楚为什么您不只使用 raw_data = openFile.variables['MergedReflectivityQCComposite'][:]
  • 这个简单的步骤将读取速度提高了一个数量级。谢谢!我将尝试更多地利用 Numpy 的指针。你知道一个很好的参考资料来解释这个概念吗(这里是n00b)?
  • 我不确定它在你的情况下是否更快,但我强烈建议使用xarray - 它在更高级别处理网格数据,并使编码更好。如果您正在处理大型数组,它也可能会更快。有关性能的讨论,请参见 stackoverflow.com/questions/47180126/…

标签: python performance netcdf


【解决方案1】:

我不确定关于 np.copy 操作(确实很慢)该说什么,但我发现 UCAR 的 PyNIO 模块适用于 NetCDF 和 HDF 文件。这会将 data 放入一个 numpy 数组中:

import Nio

f = Nio.open_file(file, format="netcdf")
data = f.variables['MergedReflectivityQCComposite'][:]
f.close()

在 ndfCDF 文件上测试您的代码与 PyNIO 代码我发现 PyNIO 需要 1.1 秒,而 netCDF4 模块需要 3.1 秒。您的结果可能会有所不同;不过值得一看。

【讨论】:

  • 你知道类似的windows库吗? PyNIO 在那里不可用。
【解决方案2】:

Numpy 的强大之处在于,您可以通过它保留的有关数据的元数据创建对内存中现有数据的视图。因此,通过指针,副本总是比视图慢。正如 JCOidl 所说,目前尚不清楚您为什么不直接使用:

 raw_data = openFile.variables['MergedReflectivityQCComposite'][:] 

有关更多信息,请参阅 SciPy Cookbook 和 SO View onto a numpy array?

【讨论】:

    【解决方案3】:

    您可以为此使用 xarray。

    %matplotlib inline 
    import xarray as xr
    
    ### Single netcdf file ###
    ds =  xr.open_dataset('path/file.nc')
    
    ### Opening multiple NetCDF files and concatenating them by time ####
    ds = xr.open_mfdatset('path/*.nc', concat_dim='time
    

    要读取变量,您只需键入ds.MergedReflectivityQCCompositeds.['MergedReflectivityQCComposite'][:]

    您也可以使用xr.load_dataset,但我发现它比 open 函数占用更多空间。对于xr.open_mfdataset,您还可以根据需要沿文件的尺寸进行分块。这两个函数还有其他选项,您可能有兴趣在 xarray 文档中了解更多信息。

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 2020-09-22
      • 2016-07-12
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      相关资源
      最近更新 更多