OM-File-Format 库

Test GitHub license

Open-Meteo OM-File 格式专为高效存储和分发多维环境数据而设计。 通过对数据进行分块、压缩和索引,OM-Files 能够实现云原生随机读取,同时最大限度地减小文件大小。 该格式支持类似于 NetCDF 或 HDF5 的分层数据结构。

此库以 C 语言实现该格式,并将高级 Swift 抽象直接集成到 Open-Meteo 天气 API 中。 计划未来支持 Python、TypeScript 和 Rust 的绑定。

注意: 此库正处于高度实验阶段。 虽然 Open-Meteo 多年来一直使用该格式,但此独立库于 2024 年 10 月启动,旨在提供 Python 绑定。 我们的目标是提供一个强大的 Python 库,以便通过 AWS 开放数据赞助访问 S3 上的 Open-Meteo 天气数据库

功能

核心原则

待办事项

Swift 库接口

Swift 代码可以在 ./Swift 中找到,测试代码可以在 ./Tests 中找到

TODO:记录函数 + 示例

C 库接口

C 代码位于 /c

TODO 记录 C 函数

数据分层模型

Variable 可以是不同的类型

示例

以下示例演示了如何将带有属性的数据编码为 OM-File 格式

示例 1:OM-File 内的普通数组

Root: Name="temperature_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]

示例 2:带有属性的数组

Root: Name="temperature_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
|- Name="dimension_names" Type=String-Array Dimensions=[3]
|- Name="long_name" Type=String Value="Temperature 2 metres above ground"
|- Name="unit" Type=String Value="Celsius"
|- Name="height" Type=Int32 Value=2

示例 3:带有属性的多个数组

Root: Type=None
|- Name="temperature_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
  |- Name="dimension_names" Type=String-Array Dimensions=[3]
  |- Name="long_name" Type=String Value="Temperature 2 metres above ground"
  |- Name="unit" Type=String Value="Celsius"
  |- Name="height" Type=Int32 Value=2
|- Name="relative_humidity_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
  |- Name="dimension_names" Type=String-Array Dimensions=[3]
  |- Name="long_name" Type=String Value="Relative Humidity 2 metres above ground"
  |- Name="unit" Type=String Value="Percentage"
  |- Name="height" Type=Int32 Value=2

模型

classDiagram
    Variable <|-- Variable
    Variable --|> Int8
    Variable --|> Int16
    Variable --|>String
    Variable --|> Array
    Trailer --|> Variable
    Variable : +String_name
    Variable : +Variable[]_children
    Variable : +Enum_data_type
    Variable : +Enum_compression_type
    Variable: +number_of_childen()
    Variable: +get_child(int n)
    Variable: +get_name()
    class Trailer {
        +version
        +root_variable
    }
    class Int8{
      +Int8 value
      +read()
    }
    class Int16{
      +Int16 value
      +read()
    }
    class String{
      +String_value
      +read()
    }
    class Array{
        +Int64[]_dimensions
        +Int64[]_chunks
      +Int64_look_up_table_offset
      +Int64_look_up_table_size
      +read(offset:Int64[],count:Int64[])
    }
加载

旧版二进制格式

新的二进制格式

二进制表示

标头消息

字节 1 字节 2 字节 3 字节 4 字节 5 字节 6 字节 7 字节 8
魔数“OM” 版本

尾部消息

字节 1 字节 2 字节 3 字节 4 字节 5 字节 6 字节 7 字节 8
魔数“OM” 版本 保留 保留
根变量的大小
根变量的偏移量

变量消息

字节 1 字节 2 字节 3 字节 4 字节 5 字节 6 字节 7 字节 8
数据类型 压缩类型 名称大小 子项数量
值/LUT 的大小(仅数组和字符串)
值/LUT 的偏移量(仅数组)
维度数量(仅数组)
比例因子(浮点数,仅数组) 添加偏移量(浮点数,仅数组)
N * 子项大小
N * 子项偏移量
N * 维度长度(仅数组)
N * 块维度长度(仅数组)
值的字节数(标量、字符串,非数组)
名称的字节