【问题标题】:Merge thousand of IMERG 30-min rainfall netcdf files into single netcdf将数千个 IMERG 30 分钟降雨 netcdf 文件合并为单个 netcdf
【发布时间】:2020-10-21 14:43:39
【问题描述】:

我从 https://disc.gsfc.nasa.gov/datasets/GPM_3IMERGHH_06/summary?keywords=IMERG 下载了 8736 个 nc4 文件(2000 年 6 月 1 日至 12 月 31 日的 30 分钟降雨量),命名约定

3B-HHR.MS.MRG.3IMERG.20000601-S000000-E002959.0000.V06B.HDF5.nc4

3B-HHR.MS.MRG.3IMERG.20000601-S003000-E005959.0030.V06B.HDF5.nc4

开始日期/时间:GPM 中的所有文件都将使用产品中包含的数据的时间段的开始日期/时间命名。该字段有两个由连字符分隔的子字段。

开始日期:YYYYMMDD 开始时间:以大写字母S 开头,然后以HHMMSS 开头 结束时间:以大写字母E 开头并以HHMMSS 结尾 小时以 24 小时时间格式显示,“00”表示午夜。 GPM 中的所有时间都将采用协调世界时 (UTC)。

半小时序列从 0000 开始,每天每半小时递增 30。

我想将所有文件合并到一个 nc4 中。原因是,我想做进一步的处理,即。计算滚动总和以获得 6 或 12 小时的降雨累积,以及其他分析。

我遵循其他类似主题的建议,使用: cdo mergetime file*.nc4 output.nc4ncecat file*.nc4 output.nc4 但两者都失败了,错误为argument list too long

按照下面的答案建议将文件拆分为单独的列表(按月),我确实使用了以下脚本:for i in $(seq -f "%02g" 1 12); do mkdir -p "Month$i"; mv 3B-HHR.MS.MRG.3IMERG.????$i*.nc4 "Month$i"; done

并增加限制,现在我的mac上的ulimit -s给出答案65536

然后我再次尝试在包含 1440 个文件的文件夹中使用 ncecat file*.nc4 output.nc4 并且它工作正常。

但我刚刚意识到结果记录维度为 UNLIMITED 并且时间 = 1。

当我使用 Panoply 打开 output.nc4 时,Record = 1440 和 Time 只有 1 个信息:Date 1 Jun 2000

这对我作为新用户来说是新事物,我希望我会像使用每日或每月数据时一样获得类似的输出,时间维度将具有 UNLIMITED 值。

任何建议如何解决上述问题?有什么我应该做的步骤吗?

【问题讨论】:

    标签: nco cdo-climate


    【解决方案1】:

    我认为这是传递给命令的参数大小的堆栈限制,您可以通过键入来查看

    ulimit -s 
    

    你可能会得到 8192 的答案。

    你可以尝试增加这个,例如

    ulimit -s 32768
    

    看看是否能解决问题。在我的 MAC 上,我无法超过这个新值;尝试将此软限制设置为 65536,给了我一个“ulimit:值超出硬限制”错误。

    【讨论】:

    • 我已经修改了问题并增加了限制,得到了65536。但仍然对结果感到困惑。
    【解决方案2】:

    对我来说,这听起来像是一个 shell 限制(可能是 Windows?)。 ncecat 一次最多打开 3 个文件。 NCO Users Guide 描述了处理任意长的输入文件列表的多种解决方法。这些方法中至少有一种对您有用。提示:尝试将-n 选项与手册中所示的符号链接结合使用。

    编辑以回应评论,2020-10-22: 以下是手册演示如何为一百万个文件创建命名良好的符号链接:

    # Create enumerated symbolic links
    /bin/ls | grep \.nc | perl -e \
    '$idx=1;while(<STDIN>){chop;symlink $_,sprintf("%06d.nc",$idx++);}'
    ncecat -n 999999,6,1 000001.nc foo.nc
    # Remove symbolic links when finished
    /bin/rm ??????.nc
    

    您可以通过使用模式限制列表来缩短通过管道传输到 /bin/ls 的参数数量,因此 shell 停止抱怨,然后重复直到所有文件都有链接。然后执行示例中显示的单个ncecat 命令,使用 one 文件名,就完成了。

    针对最新问题 20201101 进行编辑:

    当您真正需要的是ncrcat 时,您似乎使用了ncecat。他们的区别有点微妙。既然您解决了 shell 限制,解决问题的最简单方法就是使用 ncrcat 而不是 ncecat 重新执行命令:

    ncrcat file*.nc4 output.nc4
    

    【讨论】:

    • 我无法打开上面的链接(奇怪),但我认为它与这个nco.sourceforge.net/nco.html#Large-Numbers-of-Files 相同,我尝试使用选项-n loop 并在链接上使用ls | grep 进行以下示例。但是再次遇到同样的错误,参数列表太长,对于 ncecat 和 grep
    • 感谢示例脚本,但作为新用户和我理解脚本的知识有限,我很难理解和实现您的代码。我已经更新了我的问题并使用 ncecat 我可以合并所有文件,但 nc4 文件数量较少。但遗憾的是结果并不如预期。
    【解决方案3】:

    这几乎可以肯定是特定于操作系统的问题。如果您在 Linux 上,默认情况下一次只能打开 1024 个文件。我不知道macOS。

    您可以更改限制(例如,参见 here),但这可能不是一个好主意。

    所以最好的办法是将文件分成 9 个单独的列表,创建 9 个合并的文件,然后合并这些文件。

    【讨论】:

    • 我正在使用 macOS。我点击了链接,增加了限制,但仍然遇到同样的问题。无论如何,如果我找不到更好的主意,我稍后会尝试创建单独的列表,因为我会采用类似的方法来合并 2000 年的数据。
    • 我按照您的建议将文件拆分为单独的列表(按月减少文件数量),并且能够合并,但结果不如预期。我已经修改了问题,以便更清楚地了解我正在处理的文件信息。
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 2022-01-08
    • 2019-06-19
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多