将数千个IMERG 30分钟降雨netcdf文件合并为单个netcdf

如何解决将数千个IMERG 30分钟降雨netcdf文件合并为单个netcdf

我从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。

ncdump

当我使用Panoply打开output.nc4时,Record = 1440和Time仅具有1条信息:日期2000年6月1日

Panoply

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

任何建议如何解决上述问题?我应该采取什么步骤?

解决方法

几乎可以肯定这是特定于OS的问题。如果您使用的是Linux,则默认情况下一次只能打开1024个文件。我不知道macOS。

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

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

,

听起来像是外壳的限制(可能是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的自变量的数量,以便外壳程序停止抱怨,然后重复执行直到所有文件都具有链接为止。然后,使用示例文件中的 one 文件名执行示例中显示的单个ncecat命令。

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

当您真正需要的是ncecat时,您似乎使用了ncrcat。它们之间的差异有些微妙。现在您已经解决了外壳程序限制,解决问题的最简单方法就是使用ncrcat而不是ncecat重新执行命令:

ncrcat file*.nc4 output.nc4
,

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

查看
ulimit -s 

您可能会得到8192的答案。

您可以尝试增加该值,例如

ulimit -s 32768

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?