【问题标题】:Is there a way to store data-points instead of creating multi-dimensional array?有没有办法存储数据点而不是创建多维数组?
【发布时间】:2019-01-17 19:31:45
【问题描述】:

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

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

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

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

非常感谢您。

【问题讨论】:

  • 您可以创建一个存储点的中心对象,然后有多种关联方式访问同一个中心对象,只需在各种访问对象和中心引用对象之间创建引用,没有限制,所有将指向相同的数据,为您提供到达相同位置的多种方式。

标签: netcdf unidata


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 我正要写一个类似的答案。只是补充一点,如果您不想搜索特定点,而只是想在您拥有数据的每个点上执行操作,那么列表表示就可以了。此外,由于不必处理非常稀疏的 4D 数组,您不仅可以节省磁盘空间,还可以节省程序内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2020-02-23
    相关资源
    最近更新 更多