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 文件系统
每月 164 次下载
9MB
4K SLoC
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 文件中读取时。
这个简单的基准测试尝试使用来自 hidefix
的 cached
读取器以及 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