9个版本

0.8.1 2021年11月21日
0.7.1 2021年1月27日
0.7.0 2020年8月9日
0.6.1 2020年4月12日
0.2.1 2015年7月30日

#91 in 数据结构

Download history 3569/week @ 2024-04-23 3436/week @ 2024-04-30 3295/week @ 2024-05-07 3562/week @ 2024-05-14 2221/week @ 2024-05-21 3241/week @ 2024-05-28 4519/week @ 2024-06-04 3513/week @ 2024-06-11 3245/week @ 2024-06-18 3493/week @ 2024-06-25 3630/week @ 2024-07-02 3867/week @ 2024-07-09 3407/week @ 2024-07-16 4608/week @ 2024-07-23 5036/week @ 2024-07-30 4365/week @ 2024-08-06

18,041 每月下载量
41 个crate中使用 (直接使用 33 个)

MIT/Apache

765KB
19K SLoC

hdf5-rust

HDF5的Rust版本。

Build Latest Version Documentation Changelog hdf5: rustc 1.51+ Total Lines Apache 2.0 MIT

hdf5 crate(以前称为 hdf5-rs)提供了对HDF5库API的线程安全Rust绑定和高层包装。一些功能包括

  • 通过可重入互斥锁保证非线程安全的libhdf5构建的线程安全性。
  • 大多数HDF5类型的本地表示,包括变长字符串和数组。
  • 推导宏,用于自动将用户struct和enum映射到HDF5类型。
  • 通过 ndarray 提供多维数组读取/写入接口。

还提供了直接的底层绑定,并在 hdf5-sys crate中提供。

需要1.8.4或更高版本的HDF5库。

示例

#[cfg(feature = "blosc")]
use hdf5::filters::blosc_set_nthreads;
use hdf5::{File, H5Type, Result};
use ndarray::{arr2, s};

#[derive(H5Type, Clone, PartialEq, Debug)] // register with HDF5
#[repr(u8)]
pub enum Color {
    R = 1,
    G = 2,
    B = 3,
}

#[derive(H5Type, Clone, PartialEq, Debug)] // register with HDF5
#[repr(C)]
pub struct Pixel {
    xy: (i64, i64),
    color: Color,
}

impl Pixel {
    pub fn new(x: i64, y: i64, color: Color) -> Self {
        Self { xy: (x, y), color }
    }
}

fn write_hdf5() -> Result<()> {
    use Color::*;
    let file = File::create("pixels.h5")?; // open for writing
    let group = file.create_group("dir")?; // create a group
    #[cfg(feature = "blosc")]
    blosc_set_nthreads(2); // set number of blosc threads
    let builder = group.new_dataset_builder();
    #[cfg(feature = "blosc")]
    let builder = builder.blosc_zstd(9, true); // zstd + shuffle
    let ds = builder
        .with_data(&arr2(&[
            // write a 2-D array of data
            [Pixel::new(1, 2, R), Pixel::new(2, 3, B)],
            [Pixel::new(3, 4, G), Pixel::new(4, 5, R)],
            [Pixel::new(5, 6, B), Pixel::new(6, 7, G)],
        ]))
        // finalize and write the dataset
        .create("pixels")?;
    // create an attr with fixed shape but don't write the data
    let attr = ds.new_attr::<Color>().shape([3]).create("colors")?;
    // write the attr data
    attr.write(&[R, G, B])?;
    Ok(())
}

fn read_hdf5() -> Result<()> {
    use Color::*;
    let file = File::open("pixels.h5")?; // open for reading
    let ds = file.dataset("dir/pixels")?; // open the dataset
    assert_eq!(
        // read a slice of the 2-D dataset and verify it
        ds.read_slice::<Pixel, _, _>(s![1.., ..])?,
        arr2(&[
            [Pixel::new(3, 4, G), Pixel::new(4, 5, R)],
            [Pixel::new(5, 6, B), Pixel::new(6, 7, G)],
        ])
    );
    let attr = ds.attr("colors")?; // open the attribute
    assert_eq!(attr.read_1d::<Color>()?.as_slice().unwrap(), &[R, G, B]);
    Ok(())
}

fn main() -> Result<()> {
    write_hdf5()?;
    read_hdf5()?;
    Ok(())
}

兼容性

平台

hdf5 crate已知可以在以下平台上运行:Linux、macOS、Windows(在Ubuntu 16.04、18.04和20.04、Windows Server 2019(MSVC和GNU工具链)以及macOS Catalina上测试过)。

Rust

hdf5 crate对所有三个官方发布渠道进行了持续测试,并需要一个相当新的Rust编译器(例如版本1.51或更高版本)。

HDF5

所需HDF5版本为1.8.4或更高。用户代码不需要通过启用线程安全选项来构建库,以便使代码线程安全。

支持并测试了各种HDF5安装选项:通过包管理器如homebrew和apt;Windows上的系统级安装;来自官方渠道和conda-forge的conda安装。在Linux和macOS上,支持并测试了OpenMPI和MPICH并行构建。

还可以从源代码构建HDF5 C库,并通过启用 hdf5-sys/static 功能将库静态链接(需要CMake)。

构建

HDF5版本

hdf5-syshdf5 创建构建脚本会检查它们所链接的 HDF5 库的实际版本,并且某些功能可能会在编译时根据条件启用或禁用。虽然这允许在一个代码库中支持多个 HDF5 版本,但库用户如果选择使用低级 FFI 绑定,应该对此有所了解。

环境变量

如果设置了 HDF5_DIR,构建脚本将只在该位置(其他位置不会)查找 HDF5 的头文件和二进制文件(即,它将在 $HDF5_DIR/include)下查找头文件)。

如果设置了 HDF5_VERSION,构建脚本将检查库版本是否与指定的版本字符串匹配;在某些情况下,它还可能由构建脚本用于帮助定位库(例如,在 macOS 上通过 Homebrew 安装了 1.8 和 1.10 时)。

conda

可以将链接到 hdf5 conda 包;一些注意事项和技巧

  • HDF5_DIR 指向 conda 环境根目录。
  • 构建脚本了解 conda 环境布局的具体情况,并将相应地调整路径(例如,Windows 环境中的 Library 子文件夹)。
  • 在 Windows 上,环境的 bin 文件夹必须在 PATH 中(或者在运行 cargo 之前激活环境)。
  • 在 Linux / macOS 上,建议设置 rpath,例如通过设置 RUSTFLAGS="-C link-args=-Wl,-rpath,$HDF5_DIR/lib"
  • 对于 macOS 上 HDF5 conda 包的旧版本,可能还需要设置 DYLD_FALLBACK_LIBRARY_PATH="$HDF5_DIR/lib"

Linux

构建脚本将首先尝试使用 pkg-config,对于 HDF5 的较新版本,这通常无需进一步调整即可正常工作。然后构建脚本还会在 Ubuntu 上 apt 安装 HDF5 后的一些标准位置中查找 HDF5。

macOS

在 macOS 上,如果可用,构建脚本将尝试通过 Homebrew 定位 HDF5。如果安装了 1.8 和 1.10 并可用,除非设置了 HDF5_VERSION,否则默认使用 1.10。

Windows

hdf5 包完全支持 MSVC 工具链,允许使用 HDF5 的官方发布版,这通常是推荐的做法。尽管如此,之前的实验表明,所有测试在 gnu 目标上也能通过,只需小心构建 HDF5 二进制文件并配置构建环境即可。

在 Windows 上构建时需要注意以下几点

  • 在构建时间和运行时(包括 gnumsvc),必须确保 hdf5.dll 可在搜索路径中找到。这通常需要将 HDF5 安装目录的 bin 文件夹添加到 PATH 中。如果使用官方 HDF5 发布版(仅限 msvc),这通常由安装程序自动完成。
  • msvc:安装的 Visual Studio 版本应与 HDF5 二进制文件(2013 或 2015)相匹配。请注意,不需要运行 vcvars 脚本;Rust 构建系统会处理这一点。
  • 在为任一目标构建时,确保搜索路径中没有冲突(例如,MinGW 工具链的一些二进制文件可能会屏蔽 MSVS 可执行文件或反之亦然)。
  • 对于 gnu 目标,建议使用 MinGW-GCC 的 TDM 发行版,因为它包含 32 位和 64 位的 bintools。
  • 对于 msvc 目标,建议使用 VS2015 x64,因为这与 CI 构建配置相匹配,但 VS2013 和 x86 也应同样有效。

许可证

hdf5 库主要根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款分发。有关详细信息,请参阅 LICENSE-APACHELICENSE-MIT

依赖项

~3–4.5MB
~88K SLoC