读取grb2文件很慢

Posted

技术标签:

【中文标题】读取grb2文件很慢【英文标题】:Read grb2 files is very slow 【发布时间】:2021-02-17 21:49:51 【问题描述】:

使用以下代码读取大约 100 兆字节的 grb2 文件需要 5 分钟:

import cfgrib
datasets = cfgrib.open_datasets(grib_path, backend_kwargs='indexpath': '')

有什么方法或库可以让我更快地阅读这些文件吗?

【问题讨论】:

尝试使用; xarray.open_dataset(grib_path, engine='cfgrib') 并分享您的文件,我们可以重现您的问题。并且 open_datasets 返回一个您不需要传递的所有子集的列表backend_kwargs='indexpath': '' 问题是 grib2 文件非常压缩且难以阅读 速度和你告诉我的功能一样 你们有适合 eccodes 的 grib 表吗?并将文件上传到云存储并分享链接。然后我会检查它有什么问题。 【参考方案1】:

这实际上是这里提出的一个烦人的问题。使用 12Mb 的 Grib 文件,读取单个字段,cfgrib 需要 19 秒,而使用 pynio 需要 0.02 秒!超过 900 倍!

ps:parallel = True 结果:open_dataset() 得到了一个意外的关键字参数“parallel”

pynio 代码:

    import time
    import Nio
    import xarray as xr
    start = time.time()

    filename  = "full_path_to_the_grb2_file"
    parameter = "parameter_name"
    ds  = xr.open_dataset(filename, engine="pynio")
    var = ds.get(parameter)
    end = time.time()
    print("Elapsed time = ", round(end-start,5))

带有 cfgrib 的代码:

    import time
    import cfgrib
    import xarray as xr
    start = time.time()

    filename  = "full_path_to_the_grb2_file"
    parameter = "parameter_name"
    start = time.time()
    ds = xr.open_dataset(filename, engine="cfgrib", backend_kwargs="indexpath":"") 
    var = ds.get(parameter)
    end = time.time()
    print("Elapsed time = ", round(end-start,5))

例如,如果您尝试使用来自 GFS-wave (NOMADS) 的 grib2 文件:

    filename = "gfswave.txxz.global.0p25.f000.grib2"

对于参数:组合风浪和膨胀的显着高度

    parameter = "HTSGW_P0_L1_GLL0"  # with pynio"
    parameter = "swh"               # corresponding parameter with cfgrib 

【讨论】:

太棒了!!你能展示一个带有pynio的代码示例吗? @jay : 我添加了 pynio 和 cfgrib 代码的示例。【参考方案2】:

您可以激活并行读取以提高读取速度:

import xarray
data = xarray.open_dataset(grib_path, engine='cfgrib', parallel=True)

【讨论】:

open_dataset() 得到了一个意外的关键字参数 'parallel'

以上是关于读取grb2文件很慢的主要内容,如果未能解决你的问题,请参考以下文章

Java读取长文本文件很慢

php读取csv文件时 用phpexcel很慢 用fgetcsv()函数中文乱码 请问还有啥excel库或函数方法来读csv文件吗

c#使用for循环逐行读取excel数据很慢

OpenWrt 开 smb共享,局域网读取速度很慢,怎么破

为啥从队列中并行读取消息很慢?

OpenWrt 开 smb共享,局域网读取速度很慢,怎么破