我们在 HDF5 中获得了一些文件,其中包含数据集、表格数据,其中每一列都被命名并且可能是不同的数据类型(例如字符串类型的“作者”、无符号整数类型的“计数”等)我能找到的用于阅读 HDF5 的唯一纯 Java(即非 JNI)库是 NetCDF。
看来我可以使用 NetCDF 从 HDF5 数据集中读取单列数据Variable
。但是有没有办法从数据集中读取整个数据表?NetCDF 的 HDF5 数据集是否仅仅是具有单维数组值的变量集合而不是表?
编辑:让我进一步解释。如果我在 HDFView 2.9 中打开一个 HDF5 文件,导航到“HDF5 复合数据集”项,然后选择“打开”,就会出现一个漂亮的小表格,其中“变量”显示为列标题,每一行都是由索引标记。例如,假设有一个整数 32 符号类型的“Foo”列和一个字符串类型的“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 答案的详细阐述。由于某种原因,每个变量(列)都认为它是可变长度的,即使它的父结构(数据集/表)是固定长度的。要以更表格的方式处理一组变量,请获取对父级Structure
(本身 a Variable
)的引用,并询问其大小。该Structure.getSize()
值将正确指示每个变量的长度——即使每个变量Variable.getSize()
都会返回1
。