有没有一种方法可以存储数据点而不是创建多维数组?

时间:2019-01-16 07:22:17

标签: netcdf unidata

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

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

拥有这么多的填充值似乎毫无用处。是否可以仅使用包含数据的点或可能较少使用填充值的点来编写合法的netCDF文件?

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

非常感谢您。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

  • 如果您使用HashMap<Coords, Value>,则可以进行O(1)查找。但是,这需要大量的额外存储成本。与使用ArrayList表示法相比,每个条目大概增加了50到80个字节。

答案 1 :(得分:1)

应该可以使用CF Conventions所概述的一种离散采样几何(DSG)(这里是一些examples)来表示每个网格点的数据。也许这些表示形式之一适合您的情况(可能是timeSeriestimeSeriesProfile)? DSG通常是在观测数据的背景下讨论的,但它们也应应用于子采样模型输出。