【问题标题】:Opinions on NetCDF vs HDF5 for storing scientific data?对 NetCDF 与 HDF5 存储科学数据的看法?
【发布时间】:2010-11-07 16:28:05
【问题描述】:

有没有人有足够的使用 NetCDF 和 HDF5 的经验来提供一些关于它们作为存储科学数据的方式的优点/缺点?

我使用过 HDF5 并希望通过 Java 进行读/写,但该接口本质上是 C 库的包装器,我觉得这很令人困惑,因此 NetCDF 看起来很有趣,但我对此几乎一无所知。

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

update — 看起来 NetCDF-Java 从 netCDF-4 文件读取,但只从不支持分层组的 netCDF-3 文件写入。该死。

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

【问题讨论】:

  • 后记:HDF5 在 Python 中使用 PyTables 比在 Java 中更容易使用。
  • 不幸的是,对于 Java 用户,netCDF 和 HDF5 都是用 C 开发的,主要是为 C 或 Fortran 用户开发的。大多数其他 API,如 Python,都构建在 C 层之上。)
  • @EdwardHartnett -- 我不认同这个论点。当然,这意味着您不会免费获得任何好的 Java 功能,但是人们已经冒险在 Python 中创建有用的 API。没有理由有人不能在 Java 中做到这一点。 (实际上,当我在 2009 年发布这个问题时,我自己在一家前公司做了这件事——在很小程度上——但我无权访问该代码。)

标签: hdf5 netcdf


【解决方案1】:

尝试在每个中编写一些小示例应用程序,并比较体验。如果您的代码未来可扩展性以并行执行(通过 MPI 等)对您很重要,我知道 HDF 有一个并行实现,人们一直在努力改进它。我不确定 NetCDF。

后期编辑:对于 NetCDF,现在有来自 Argonne 的 Parallel NetCDF。它运行良好,开发团队非常积极地进一步改进它。

【讨论】:

  • Unidata 的 netCDF 库也直接支持并行 IO,该库在底层使用 HDF5 或 parallel-netcdf 来提供并行 IO。
【解决方案2】:

我不得不承认,从长远来看,使用 HDF5 要容易得多。将简单的数据结构转换为 NetCDF 格式并不难,但在以后操作它们有点痛苦。

HDF5 中的“H”代表“层次结构”,它(无论如何对我来说)翻译成一种非常简单的数据操作方式,只需移动节点并从其他地方引用节点。

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

不管你怎么走,祝你好运!

【讨论】:

【解决方案3】:

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

在我编写 Q5Cost 时,我们对 HDF5 与 NetCDF 进行了准确的评估,最终的结果是 HDF5 毫无疑问。

【讨论】:

  • 答案已经过时 - netCDF 现在基于 HDF5 构建
  • @abe 不一定。 netcdf4 仍然具有与 netcdf3 的一些向后兼容性。这意味着某些压缩选项仍然无法用于 nc 文件。
  • @badgley - 使用 netCDF 编写 netCDF-4 文件时缺少哪些压缩选项?
  • @StefanoBorini 如果您能澄清您的评估是否仍适用于 NetCDF-4/HDF5 或仅适用于早期版本,那就太好了。
  • NetCDF-4 公开了 HDF5 的几乎所有功能,包括压缩。 H5utils 将适用于 netCDF-4 文件,这些文件也是完全有效的 HDF5 文件。
【解决方案4】:

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

HDF5 功能极其丰富,并具有一些出色的性能特性。

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

【讨论】:

  • 上次我检查,Java 库不允许写入 HDF5 文件。无论如何,这是一个有争议的问题,因为我已经转向其他事情了。 :-/
  • 感谢您的简洁回答,这是非常有用的信息,尽管如果有一些参考资料会更好:)
  • "可以读写大多数 HDF5 文件"。不,它不能。 NetCDF4 使用 HDF5 就像应用程序使用文件系统一样。它读写 HDF5 1.8 上的特定结构
  • NetCDF-4 可以读取所有不使用引用或具有循环组结构的 HDF5 文件。有关 netCDF-4 可以读取的 HDF5 文件限制的完整列表,请参阅常见问题解答:unidata.ucar.edu/software/netcdf/docs/…
【解决方案5】:

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。

【讨论】:

【解决方案6】:

NetCDF 将 HDF5 转换为自己的数据模型,看起来和工作都很棒...until you find out that NetCDF doesn't support unsigned values!另请参阅my question,了解如何使用 NetCDF 检测现有 HDF5 文件中的无符号值。

更新: 事实上,虽然 NetCDF-3 不支持有符号值,但 NetCDF-4 支持有符号值,尽管 Java 中用于确定有符号性的 NetCDF API 是 a little convoluted .

【讨论】:

  • 嗯...您的一半回答说 NetCDF 不支持 unsigned 值,另一半则表示它不支持 signed价值观。会是哪个?第一个链接仅表示 NetCDF 3 没有无符号 整数,通常没有值。此外,第二个链接表明问题出在 java,而不是 netCDF4。真的,这有什么关系呢?这意味着您有一半的整数用于索引,但您仍然有 2^31 (= 20 亿) 或 2^63 (9 * 10^18),具体取决于您的系统。
  • 澄清一下,netCDF-4 C 库支持无符号整数(8、16、32 和 64 位)。 netCDF Java 库不能创建无符号类型,但可以读取大小为 8、16 和 32 位的无符号类型,方法是将它们提升为更大大小的有符号类型。 (也就是说,netCDF 文件中的 16 位无符号整数字段看起来像 java 中的 32 位有符号字段。)这都是因为 Java 不支持无符号类型。
【解决方案7】:

我知道这是一篇较旧的帖子,原始发帖人表示他们已经继续前进,但是对于最终出现在这里的任何人...... netCDF-Java 库(截至 4.3.13)具有 netCDF-4 写入通过 netCDF C 库提供支持。它仍处于测试阶段,但它确实有效,feedback 肯定会受到赞赏!

有关详细信息,请参阅 netCDF-Java reference 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多