#h3 #finite-state #set #map #fst

h3o-ice

基于有限状态转换器的H3单元的冻结(即只读)集合和映射

4个版本

0.1.3 2024年3月25日
0.1.2 2024年3月20日
0.1.1 2024年1月15日
0.1.0 2023年9月11日

#1003 in 数据结构

Download history 141/week @ 2024-04-08 129/week @ 2024-04-15 146/week @ 2024-04-22 51/week @ 2024-04-29 53/week @ 2024-05-06 98/week @ 2024-05-13 74/week @ 2024-05-20 111/week @ 2024-05-27 89/week @ 2024-06-03 108/week @ 2024-06-10 93/week @ 2024-06-17 63/week @ 2024-06-24 67/week @ 2024-07-01 57/week @ 2024-07-08 85/week @ 2024-07-15 72/week @ 2024-07-22

每月283次下载

BSD-3-Clause

67KB
667 代码行

h3o-ice — 对于H3单元索引的冻结(即只读)集合和映射

Crates.io Docs.rs CI Status Coverage License

这些数据结构基于有限状态转换器构建,允许它们非常紧凑同时提供快速的查找。

这特别适用于只读索引(无论是内存中还是磁盘上)。

安装

Cargo

  • 按照指南安装rust工具链,以便安装cargo。
  • 运行 cargo install h3o-ice

使用

use h3o::{LatLng, Resolution};
use h3o_ice::FrozenSet;

let coord = LatLng::new(48.872280706 2.332697839).expect("valid coord");
let set = FrozenSet::try_from_iter(
    coord.to_cell(Resolution::Nine)
        .children(Resolution::Ten)
)
.expect("failed to create set");

set.contains(CellIndex::try_from(0x8a1fb4666417fff).expect("valid cell"));

与其他数据结构的比较

冻结{集合,映射} BTree{集合,映射} 哈希{集合,映射}
内存开销 ✅ (负值[^1]) ❌ (50%[^2]) ❌ (12-125%[^2])
搜索复杂度 O(key大小) O(log #items) O(1)
范围查询
前缀查找
插入/删除
直接查找 163 ns 55 ns 19 ns
压缩查找 67 ns 401 ns 125 ns

关于查找时间

  • 输入数据集是法国覆盖范围,分辨率为10
    • 原始数据集:44,250,550个单元(333.60M)。
    • 压缩后(即用祖先单元替换单元簇):127,264个单元(0.97M)
  • 查找分辨率为10的单元
    • 在原始数据集中的单个查找。
    • 在压缩数据集中的前缀查找(如果不支持,则为重复查找)。

您可以运行提供的基准测试以获取与您的机器相关的度量。

总之

  • 如果您可以承受内存使用量并且不关心顺序(例如范围查询),请选择HashSet以获得最大速度。
  • 如果您需要排序但不需要处理压缩集合,请选择BTreeSet。
  • 如果您有一个大型的只读数据集,希望优化内存使用并能够直接查询压缩数据,那么FrozenSet将是您的朋友。

Frozen{Map,Set} 并不是通用数据结构。它们附带许多额外约束(只读,必须从预先排序的输入构建,...),但在特定领域表现出色,并提供许多优点(例如,键压缩,可映射到内存映射文件,前缀查找,...)。

许可证

BSD 3 条款

[^1]: Frozen{Set,Map} 压缩键的公共前缀和后缀,结果比输入数据集更小(例如,333MB 测试数据集可以放入 176KB 的 FrozenSet) [^2]: Rust 中 HashMap 的开销度量

依赖关系

~6.5MB
~46K SLoC