0

我正在尝试读取可用数据并将其写入 NetCDF 文件。比如说,我正在沿不同的时间、深度、纬度和经度值读取温度,我将不得不创建一个完整的 4D 时间、深度、纬度和经度网格作为维度。

但是,我正在记录的数据在很少的点上具有价值。例如,在其中一种情况下,我有 155 个点的数据,而网格的时间、深度纬度和经度分别为 50x16x16x18。因此,在具有 230400 个单元格的网格中,我只有 155 个点的数据。其余所有点都有填充值。

有这么多的填充值似乎毫无用处。是否可以编写一个合法的 netCDF 文件,其中仅包含有数据的点,或者可能更少使用填充值?

我正在为该过程使用 NetCDF Java 库。

非常感谢你。

4

2 回答 2

1

应该可以使用CF 公约概述的离散采样几何 (DSG) 之一来表示每个网格点的数据(这里有一些示例)。也许这些表示中的一种适用于您的情况(也许timeSeriestimeSeriesProfile)?DSG 经常在观测数据的背景下被讨论,但它们也应该适用于子抽样模型输出。

于 2019-01-16T16:15:47.047 回答
1

任何 N 维稀疏数组都可以表示为元组的列表(或一维数组),其中每个元组具有 N 个坐标值和一个数据值。

如果数组足够稀疏,则基于列表的表示会占用更少的空间……在磁盘和内存中。

现在简单的基于列表的表示不适合随机访问,因为您需要扫描列表以访问原始数组中任何点的值。您可以对此进行改进(在内存版本中):

  • 如果您根据坐标对列表进行排序并使用ArrayList,则可以执行二进制搜索来查找一组坐标的值。这提供了O(log N)索引,没有额外的内存开销。

  • 如果你使用 a HashMap<Coords, Value>,你可以得到O(1)查找。然而,这会带来显着的额外内存成本。与使用ArrayList表示相比,每个条目可能会增加大约 50 到 80 个字节。

于 2019-01-16T07:53:05.203 回答