使用NetCDF Java库读取HDF5数据集

时间:2013-04-18 23:50:51

标签: java dataset hdf5 netcdf

我们已经在HDF5中获得了一些包含数据集的文件,每个列都被命名的表格数据,并且可能是不同的数据类型(例如字符串类型的“作者”,“ count“无符号整数类型等”。我可以找到的唯一用于读取HDF5的纯Java(即非JNI)库是NetCDF。

似乎我可以使用NetCDF Variable从HDF5数据集中读取单列数据。但是,没有办法从数据集中读取整个数据表吗? HDF5数据集只是NetCDF只是具有单维数组值的变量集合而不是表吗?

编辑:让我进一步解释。如果我打开HDFView 2.9中的一个HDF5文件,导航到“HDF5复合数据集”项目,然后选择“打开”,一个不错的小出现一个表,其中“变量”显示为列标题,每行由索引标记。为了便于举例,假设有一个类型为integer-32-signed的“Foo”列和一个string类型的“Bar”列。

但是用于从这个“复合数据集”加载数据的NetCDF API似乎根本不像表格数据。我可以要求加载一个名为“Foo”的整个“变量”数组,并且“变量”似乎独立于“Bar”变量。这是否意味着“Foo”和“Bar”变量可以是不同长度的数组?

在表格中,我希望能够逐行访问内容。我可以说“在第5行给我一个包含所有价值观的数组吗?”好的,所以原始值和装箱有问题,但我可以请求返回整行的基础字节吗?我可以说,“把'Foo'栏中第5行的值作为整数给我”?也许你说我真正想要的是“Foo”数组中的元素5。所以我回到原来的问题:问题1。用于数据集的NetCDF API是否只能访问一组完全不相关的变量(可能有单独的数组长度等),或者是否存在某些API允许以真实表格的形式访问这些数据吗?

如果您仍然不理解表格视图和变量列表之间的区别,请考虑以下相关问题:问题2。如何查找数据集表中的行数?我是否被迫迭代数据集中的所有变量并找到每个数组的最大长度?

由于我找到了变量的数组长度,这又引出了另一个问题:问题3. 如何在不读取整个数组的情况下找到数据集中变量的长度?如果我使用netCDFFile.findVariable("/some/path/dataset.variable").getSize(),则只返回值1。直到我实际使用netCDFVariable.read().getSize()读取整个数组(可能是几兆字节!)才得到正确的长度!是不是有更有效的方式?

答案:答案是对John Caron's answer的详细阐述。由于某种原因,每个变量(列)都认为它是可变长度的,即使它的父结构(数据集/表)是固定长度的。要以更表格的方式处理一组变量,请获取对父Structure(本身为Variable)的引用,并询问其大小。 Structure.getSize()值将正确指示每个变量的长度 - 即使每个Variable.getSize()都会返回1

2 个答案:

答案 0 :(得分:1)

  

问题1.用于数据集的NetCDF API是否仅访问组   完全不相关的变量(可能是单独的数组)   长度等),或者是否有一些API允许访问这些数据   作为一张真正的桌子?

NetCDF-Java是一个低级库,其他应用程序构建特定的接口。 HDFView就是这样一个应用程序,虽然不是基于NetCDF-Java构建的。您可以查看Unidata中的ToolsUI,它具有一些用于检查Structures数据的功能,但没有文档。

  

问题2.如何在数据集表中找到行数?上午   我被迫迭代数据集中的所有变量并找到   每个阵列的最大长度?

结构可能看起来像

Structure {
  float fld1;
  int fld2;
  ...
} sname (200);

因此它是一个数组(在本例中为1D)的结构数据(也就是HDF5中的化合物)。 所以行数是

Varible snameV = ncfile.findVariable("sname");
long nrows = snameV.getSize();
  

问题3.如何在数据集中找到变量的长度   没有读完整个阵列?如果我使用   netCDFFile.findVariable(“/ some / path / dataset.variable”)。getSize(),this   只返回值1.直到我实际读完整个   使用的数组(可能是几兆字节!)   netCDFVariable.read()。的getSize()

如果它是一个可变长度数组,那么你有:

Structure {
  float fld1;
  int fld2;
  ...
} sname (*);

其中'*'表示“可变长度尺寸”。那么没有阅读就无法找出长度。我认为它是HDF5格式的“特色”。

答案 1 :(得分:0)

NetCDF-Java将允许您访问HDF5文件中的所有数据。如果没有,它是一个错误,我们将解决。

是的,HDF5中的数据集== netCDF中的变量。

如果数据集在HDF5中属于“复合”类型,则它将是netCDF-Java中的“结构”。

除非我能获得实际文件,否则不能更具体。

约翰