24个稳定版本 (6个主要版本)
6.0.0 | 2022年9月23日 |
---|---|
5.0.3 | 2022年5月28日 |
5.0.1 | 2021年12月17日 |
4.0.2 | 2020年4月6日 |
0.9.1 | 2017年12月17日 |
#36 在 编码
87,822 每月下载量
用于 176 个crate(直接使用23个)
215KB
5K SLoC
reed-solomon-erasure
Rust实现的Reed-Solomon纠删码
还提供WASM构建版本,有关详细信息,请参阅下面的 WASM使用 部分
这是对BackBlaze的Java实现,Klaus Post的Go实现和Nicolas Trangez的Haskell实现的移植。
版本 1.X.X
复制了BackBlaze的实现,性能较低,因为可以添加并行的地方较少。
版本 >= 2.0.0
复制了Klaus Post的实现。SIMD C代码是从Nicolas Trangez的实现中复制的,并进行了一些修改。
WASM使用
有关详细信息,请参阅此处
Rust使用
要将以下内容添加到您的Cargo.toml
中,用于正常版本(纯Rust版本)
[dependencies]
reed-solomon-erasure = "4.0"
或以下内容,用于尝试利用SIMD的版本
[dependencies]
reed-solomon-erasure = { version = "4.0", features = [ "simd-accel" ] }
并添加以下内容到您的crate根目录
extern crate reed_solomon_erasure;
注意:simd-accel
针对x86-64上的Haswell+处理器进行了优化,不对其他架构进行任何优化,在构建时设置环境变量RUST_REED_SOLOMON_ERASURE_ARCH
以强制编译特定架构的C代码(GCC/Clang中的-march
标志)。即使在x86-64上,将其设置为native
也可以实现更好的性能,但将在旧CPU上停止运行,YMMV。
示例
#[macro_use(shards)]
extern crate reed_solomon_erasure;
use reed_solomon_erasure::galois_8::ReedSolomon;
// or use the following for Galois 2^16 backend
// use reed_solomon_erasure::galois_16::ReedSolomon;
fn main () {
let r = ReedSolomon::new(3, 2).unwrap(); // 3 data shards, 2 parity shards
let mut master_copy = shards!(
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[0, 0, 0, 0], // last 2 rows are parity shards
[0, 0, 0, 0]
);
// Construct the parity shards
r.encode(&mut master_copy).unwrap();
// Make a copy and transform it into option shards arrangement
// for feeding into reconstruct_shards
let mut shards: Vec<_> = master_copy.iter().cloned().map(Some).collect();
// We can remove up to 2 shards, which may be data or parity shards
shards[0] = None;
shards[4] = None;
// Try to reconstruct missing shards
r.reconstruct(&mut shards).unwrap();
// Convert back to normal shard arrangement
let result: Vec<_> = shards.into_iter().filter_map(|x| x).collect();
assert!(r.verify(&result).unwrap());
assert_eq!(master_copy, result);
}
自行进行基准测试
您可以通过克隆此repo快速测试不同配置下的性能(例如,数据奇偶校验碎片比率、并行参数):https://github.com/darrenldl/rse-benchmark
rse-benchmark
包含了这个库的副本(通常是功能齐全的开发版本),所以你只需要调整 main.rs
,然后执行 cargo run --release
来启动基准测试。
性能
版本 1.X.X
和 2.0.0
不使用 SIMD。
从版本 2.1.0
开始使用 Nicolas 的 C 文件进行 SIMD 操作。
机器:搭载 Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz (最大 2.70GHz) 2 核心 4 线程
以下显示了一种测试配置的结果,其他配置在比率方面显示相似的结果。
配置 | Klaus Post 的 | >= 2.1.0 && < 4.0.0 | 2.0.X | 1.X.X |
---|---|---|---|---|
10x2x1M | ~7800MB/s | ~4500MB/s | ~1000MB/s | ~240MB/s |
版本 >= 4.0.0
尚未进行全面基准测试
变更日志
贡献
欢迎贡献。请注意,通过提交贡献,你同意按照 LICENSE 文件中所述的与本项目相同的许可证许可你的作品。
鸣谢
库重构和 Galois 2^16 后端
感谢以下人员对库的重构和引入 Galois 2^16 后端的贡献
WASM 构建
感谢 Nazar Mokrynskyi @nazar-pc 提交了他的 WASM 构建包
他是存储在 wasm
文件夹中的文件的原始作者。这些文件可能后来被我修改。
AVX512 支持
感谢 @sakridge 为添加 AVX512 支持(见 PR #69)
build.rs 改进
感谢 @ryoqun 改进了库在交叉编译环境中的可用性(见 PR #75)
no_std 支持
感谢 Nazar Mokrynskyi @nazar-pc 添加了 no_std
支持(见 PR #90)
测试者
感谢以下人员在各种平台上进行测试和基准测试
备注
代码质量审查
如果你想评估这个库的质量,你可能觉得审计评论很有用。
只需搜索 "AUDIT" 来查看旨在促进代码审查的开发备注。
实现备注
1.X.X
实现主要复制了 BackBlaze 的 Java 实现。
2.0.0
及以后版本主要复制了 Klaus Post 的 Go 实现,并复制了来自 Nicolas Trangez 的 Haskell 实现 的 C 文件。
所有版本的测试套件以 Klaus Post 的 Go 实现 为基础。
许可证
Nicolas Trangez 的 Haskell Reed-Solomon 实现
用于 SIMD 操作的 C 文件(无/微小修改)从 Nicolas Trangez 的 Haskell 实现 复制,并使用与 NicolasT 的项目相同的 MIT 许可证。
TL;DR
所有文件均以 MIT 许可证发布
依赖项
~1.4–2MB
~32K SLoC