1 个不稳定版本

0.1.0 2022年11月14日

#818数据库接口

MIT/Apache

135KB
170

去重库

一个用于高效存储数据的 Rust 通用去重库。
报告错误

目录
  1. 关于项目
  2. 入门
  3. 用法
  4. 结果
  5. 路线图
  6. 贡献
  7. 许可协议
  8. 联系

关于项目

一切始于对 Dropbox 的观察。链接到 评论。一些用户在将文件上传到 Dropbox 时花费的时间明显更少。这是因为 Dropbox 能够检测重复文件,并且只上传新文件。架构如下所示。

这可以扩展到另一种设计,而不是整个文件,我们可以将文件拆分为块并将它们存储在数据库中。不需要存储重复项。只需要单个副本即可。我们设计了两个函数。 save_fileload_file

save_file

此函数将 filename 作为参数,并将文件保存到存储中。函数将文件拆分为块并删除重复的块。如果块已经存在,则不需要存储副本。架构如下所示。

load_file

此函数将 filename 作为参数,并从存储中加载文件。函数收集所有块并将它们组合成文件。架构如下所示。

(返回顶部)

入门

库完全用 Rust 编写。您需要安装 Rust 才能使用此库和 Cargo.toml 文件中提到的包。

先决条件

这里 安装 Rust

安装

  1. 克隆仓库
    git clone https://github.com/anirudhakulkarni/de-duplication.git
    
  2. 安装 Rust 包
     cargo build
    

(返回顶部)

用法

该库提供了两个主要函数,save_fileload_filesave_file 函数接受文件路径并将文件保存到存储中。 load_file 函数接受文件路径并从存储中加载文件。 load_file 以字节数组的形式加载文件。

示例用法

use de_duplication::deduplication::save_file;
use de_duplication::deduplication::load_file;

fn main() {
    let file_path = "test.txt";
    // writing 1,2,3,4,5 to the file
    let mut file = File::create(file_path).unwrap();
    file.write_all(b"1,2,3,4,5").unwrap();
    file.sync_all().unwrap();

    // saving the file to the storage
    save_file(file_path);
    let file = load_file(file_path);
    assert_eq!(file, vec![1, 2, 3, 4, 5]);
}

可以通过将整个内容包装在结构体中来进行更全面的用法

请参阅 dedup.rs 以创建结构体。然后请参阅 lib.rs 以了解函数的使用方式。

(返回顶部)

结果

我们将这个库部署到我们的快照和恢复服务器上,这使我们能够随意启动和暂停/恢复多个虚拟机。该库用于高效管理快照。结果如下

总体结果

我们处理了256MB的150个快照。快照的总大小为38GB。去重后的快照总大小为2.5GB。这是存储效率提高了15倍。

快照是在虚拟机执行过程中的任意点拍摄的,但库仍然能够高效地去重文件。

保存文件所需的总大小

块大小在库的效率中起着重要作用。我们用不同的块大小测试了库。结果如下

随着块大小的增加,净大小呈线性增加。这是因为库在较大的块大小下去重文件的效率较低。

保存文件所需的时间

随着块大小的减小,块的数量增加。这增加了保存和加载文件所需的时间。结果如下

注意y轴上的对数刻度。由于哈希开销,我们看到了保存文件所需时间的线性增加。

时间和空间之间的权衡

块大小权衡的极端例子是1字节和1GB。后者效率低下,因为库根本无法去重文件。前者效率低下,因为库无法高效地去重文件。

路线图

  • 去重库
  • 修改存储以使用数据库

(返回顶部)

贡献

贡献使开源社区成为一个如此令人惊叹的学习、灵感和创造的地方。您所做的任何贡献都将受到高度赞赏。

如果您有改进这点的建议,请fork存储库并创建一个pull request。您也可以简单地打开一个带有“增强”标签的问题。别忘了给项目加星!再次感谢!

  1. fork项目
  2. 创建您的功能分支(git checkout -b feature/AmazingFeature
  3. 提交您的更改(git commit -m 'Add some AmazingFeature'
  4. 推送到分支(git push origin feature/AmazingFeature
  5. 打开一个pull request

(返回顶部)

许可协议

在MIT许可证下分发。有关更多信息,请参阅LICENSE

(返回顶部)

联系

Anirudha - @4n1rudh4 - kulkarnianirudha8 [at] gmail [dot] com

依赖关系

~430KB