#concurrency #async #hdf #read-file #net-cdf

bin+lib hidefix

并发 HDF5 和 NetCDF4 读取器(实验性)

8 个版本 (5 个重大更新)

0.11.1 2024年8月12日
0.5.2 2021年1月29日
0.4.0 2021年1月18日
0.3.0 2020年11月13日
0.1.1 2020年8月20日

#195 in 文件系统

Download history 38/week @ 2024-07-01 164/week @ 2024-08-12

每月 164 次下载

LGPL-3.0-or-later

9MB
4K SLoC

Crates.io PyPI Documentation Build (rust) Build (python) codecov Rust nightly

HIDEFIX

HIDEFIX 是一个 Rust 和 Python 库,提供 HDF5 文件或 NetCDF4 文件(使用 HDF5)的替代读取器,支持数据并发访问。这是通过构建块索引来实现的,允许线程使用多个文件句柄来读取文件。使用原始(本地)HDF5 库来构建索引,但一旦创建完成,就不再需要。索引可以序列化到磁盘,因此不需要执行索引。

Rust 中

use hidefix::prelude::*;

let idx = Index::index("tests/data/coads_climatology.nc4").unwrap();
let mut r = idx.reader("SST").unwrap();

let values = r.values::<f32>(None, None).unwrap();

println!("SST: {:?}", values);

或使用 Python 和 Xarray

import xarray as xr
import hidefix

ds = xr.open_dataset('file.nc', engine='hidefix')
print(ds)

请参阅 示例,了解如何使用 hidefix 进行常规、并行或并发读取。

动机

HDF5 库需要内部锁来保证线程安全,因为它依赖于内部缓冲区,这些缓冲区不能安全地从多个线程中访问或写入。这实际上导致多线程应用程序使用顺序读取,同时竞争锁。并且显然还会相互造成麻烦,也许是通过丢弃其他线程仍然需要的缓存块。它可以安全地从不同的进程中使用,但这可能需要比多线程或异步代码更多的开销。

一些基本基准测试

hidefix 当并发读取来自同一数据集、同一文件或单个进程中的不同文件时,预期性能会更好。对于基本基准测试,性能与使用本地 HDF5 库(通过其 rust-bindings)执行标准 顺序 读取相当或略好。where hidefix 闪亮的地方是当 同一进程中的多个线程 尝试同时从 HDF5 文件中读取时。

这个简单的基准测试尝试使用来自 hidefixcached 读取器以及 HDF5 的本地读取器,顺序或并发地读取小型数据集。数据集已分块、打乱和压缩(使用 gzip)。

$ cargo bench --bench concurrency -- --ignored

test shuffled_compressed::cache_concurrent_reads  ... bench:  15,903,406 ns/iter (+/- 220,824)
test shuffled_compressed::cache_sequential        ... bench:  59,778,761 ns/iter (+/- 602,316)
test shuffled_compressed::native_concurrent_reads ... bench: 411,605,868 ns/iter (+/- 35,346,233)
test shuffled_compressed::native_sequential       ... bench: 103,457,237 ns/iter (+/- 7,703,936)

灵感和其他项目

这项工作部分基于 OPeNDAP Hyrax 服务器的 DMR++ 模块。格式 zarr 做了类似的事情,同样的方法已在 HDF5 上进行了测试。

依赖关系

约 11–28MB
约 429K SLoC