关于NetCDF和HDF5用于存储科学数据的看法?


68

有人在NetCDF和HDF5方面有足够的经验,可以为它们提供一些优点/缺点,作为存储科学数据的方法吗?

我使用过HDF5,并且想通过Java进行读写,但是该接口实际上是C库的包装,这使我感到困惑,因此NetCDF似乎很吸引人,但我对此一无所知。

编辑:我的应用程序仅用于数据记录,因此我得到的文件具有自描述格式。对我而言,重要的功能是能够添加任意元数据,具有快速写入访问权限以附加到字节数组以及具有单写入器/多读取器并发性(强烈建议但并非必须并发。NetCDF文档说它们具有SWMR,但没有没有说他们是否支持任何机制来确保两个编写者无法一次打开同一个文件而导致灾难性的结果)。我喜欢HDF5的层次结构(特别是我喜欢有向无环图的层次结构,比像“常规”文件系统的层次结构更灵活),现在正在阅读NetCDF文档...如果它只允许每个文件,那么它可能对我不起作用。:(

更新-看起来NetCDF-Java从netCDF-4文件读取,但仅从不支持层次组的netCDF-3文件写入。该死的

2009年7月14日更新:我开始对Java中的HDF5感到非常沮丧。可用的库不是很好,它有一些主要的绊脚石,它们与Java的抽象层(复合数据类型)有关。C的一种很好的文件格式,但看起来好像丢了。> :(


2
后记:HDF5是很多容易在Python中使用与PyTables,比Java。
杰森S

不幸的是,对于Java用户,netCDF和HDF5都是使用C语言开发的,主要是针对C或Fortran用户。其他大多数API,例如Python,都建立在C层之上。)
Edward Hartnett

@EdwardHartnett-我不赞成这种说法。当然,这意味着您不会免费获得任何不错的Java功能,但是人们已经投入大量精力在Python中创建有用的API。没有理由有人无法使用Java做到这一点。(实际上,我在2009年就曾在一家前公司亲自做过此事,当时我曾发布此问题,但我无法使用该代码。)
Jason S

Answers:


31

我强烈建议您使用HDF5,而不要使用NetCDF。NetCDF是扁平的,如果您无法对内容进行分类,它会在一段时间后变得很脏。当然,分类也是一个辩论的问题,但是至少您具有这种灵活性。

当我编写Q5Cost时,我们对HDF5与NetCDF进行了准确的评估,最终结果是HDF5放手。


44
答案已经过时-netCDF现在基于HDF5构建
日安倍市

@abe不一定。netcdf4仍具有一些向后兼容性w netcdf3。这意味着nc文件仍然无法使用某些压缩选项。
badgley13年

1
@badgley-使用netCDF写入netCDF-4文件时,netCDF缺少哪些压缩选项?
肖恩·A.

如果您可以澄清您的评估是否仍然适用于NetCDF-4 / HDF5或仅适用于早期版本,那么@StefanoBorini会很棒。
半安全

1
NetCDF-4几乎公开了HDF5的所有功能,包括压缩。H5utils将在netCDF-4文件上工作,这些文件也是完全有效的HDF5文件。
爱德华·哈奈特

23

从长远来看,我不得不承认使用HDF5非常容易。将简单的数据结构转换为NetCDF格式并不难,但是要在将来对其进行操作会很痛苦。

HDF5中的“ H”代表“ heirarchical”,通过仅移动节点并从其他位置引用节点,就可以(无论如何对我而言)将其转换为一种非常简单的方式来处理数据。

请问这是什么样的项目?我将它们都用于许多HPC科学建模任务。我可以假设您也这样做吗?如果是这样,我看到的趋势是人们开始使用HDF5,但这在您的特定领域可能有所不同。

但是,最后您还是走运了,祝您好运!


2
afaik,NetCDF4是一种笨拙的HDF5,因此它对于以前版本的NetCDF都很熟悉。unidata.ucar.edu/mailing_lists/archives/netcdfgroup/2010/...
mdsumner

1
是的,但他们更试图施加结构而不是笨拙-unidata.ucar.edu/software/netcdf/docs/…
半安全

1
NetCDF-4几乎公开了所有HDF5功能,除了一些细微的例外。
爱德华·哈奈特

19

从版本4.0(2008)开始的NetCDF可以读取和写入大多数HDF5文件,并可以通过增强的数据模型访问HDF5的分层功能。

HDF5具有非常丰富的功能,并且具有一些出色的性能功能。

NetCDF具有更简单的API和更广泛的工具库。有许多处理netCDF数据的工具。


最后我检查了一下,Java库不允许编写HDF5文件。无论如何,这是我进行其他工作时的讨论重点。:-/
Jason S

感谢您的简洁回答,这是非常有用的信息,尽管如果有一些参考文献甚至会更好:)
naught101 2013年

“可以读取和写入大多数HDF5文件”。不,它不能。NetCDF4像应用程序使用文件系统一样使用HDF5。它读取和写入强加给HDF5 1.8的特定结构
半安全性,2016年

NetCDF-4可以读取所有不使用引用或具有循环组结构的HDF5文件。对于对可通过的netCDF-4读取HDF5文件限制的完整列表,请参见常见问题解答:unidata.ucar.edu/software/netcdf/docs/...
爱德华·哈奈特

10

我知道这是一篇较旧的文章,原始海报表明他们已经前进了,但是对于任何在此结束的人来说... netCDF-Java库(截至4.3.13版)通过以下方式提供了netCDF-4编写支持: netCDF C库。它仍处于测试阶段,但确实可以正常工作,反馈当然值得赞赏!

请参阅netCDF-Java参考文档以获取更多详细信息。


8

尝试在每个应用程序中编写一些小样本应用程序,然后进行比较。如果将来代码对并行执行(通过MPI等)的可伸缩性对您很重要,那么我知道HDF具有并行实现,人们正在不断地努力改进。我不确定NetCDF。

后期编辑:对于NetCDF,现在有来自Argonne的Parallel NetCDF。它工作得很好,并且开发团队非常积极地进一步改进它。


Unidata的netCDF库也直接支持并行IO,该库在幕后使用HDF5或parallel-netcdf提供并行IO。
爱德华·哈特奈特

6

1)Netcdf-4 C库是HDF-5 C库之上的一层。该API被认为比HDF5库更简单,但最终您具有几乎相同的功能。Netcdf不支持图形,但是HDF5支持。实际上,我认为HDF不会阻止图形中的周期。

2)HDF组在HDF-5 C库的顶部具有Java API。

3)Unidata具有纯Java的Netcdf-Java库,但是只能读取HDF-5。


因为HDF5没有实现共享尺寸,所以有一个论点(免责声明:我),您应该在这里写netCDF-4而不是直接写HDF5,详情请参见unidata.ucar.edu/blogs/developer/en/entry/dimensions_scales
约翰·卡伦

-2

NetCDF将HDF5转换为自己的数据模型,外观和效果很好……直到您发现NetCDF不支持无符号值!另请参阅有关如何使用NetCDF检测现有HDF5文件中未签名值的问题

更新:实际上,事实证明,尽管NetCDF-3不支持带符号的值,但NetCDF-4支持带符号的值,即使Java中用于确定符号性的NetCDF API有点费解


1
嗯...您的回答中有一半说NetCDF不支持无符号值,另一半表明它不支持有符号值。会是什么?第一个链接仅表示NetCDF 3没有无符号整数,通常没有值。另外,第二个链接指示问题出在java而不是netCDF4。实际上,这到底有什么关系?这意味着您有一半的整数可用于索引,但根据系统,仍然有2 ^ 31(= 20亿)或2 ^ 63(9 * 10 ^ 18)。
naught101

2
为了明确起见,netCDF-4 C库支持无符号整数(8、16、32和64位)。netCDF Java库无法创建无符号类型,但是可以通过将大小提升为下一个更大大小的带符号类型来读取大小为8、16和32位的无符号类型。(也就是说,netCDF文件中的16位无符号整数字段看起来像Java中的32位有符号字段。)这都是由于Java不支持无符号类型。
爱德华·哈奈特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.