1 个不稳定版本
0.1.0 | 2022年11月14日 |
---|
#818 在 数据库接口
135KB
170 行
关于项目
一切始于对 Dropbox 的观察。链接到 评论。一些用户在将文件上传到 Dropbox 时花费的时间明显更少。这是因为 Dropbox 能够检测重复文件,并且只上传新文件。架构如下所示。
这可以扩展到另一种设计,而不是整个文件,我们可以将文件拆分为块并将它们存储在数据库中。不需要存储重复项。只需要单个副本即可。我们设计了两个函数。 save_file
和 load_file
save_file
此函数将 filename
作为参数,并将文件保存到存储中。函数将文件拆分为块并删除重复的块。如果块已经存在,则不需要存储副本。架构如下所示。
load_file
此函数将 filename
作为参数,并从存储中加载文件。函数收集所有块并将它们组合成文件。架构如下所示。
(返回顶部)
入门
库完全用 Rust 编写。您需要安装 Rust 才能使用此库和 Cargo.toml
文件中提到的包。
先决条件
从 这里 安装 Rust
安装
- 克隆仓库
git clone https://github.com/anirudhakulkarni/de-duplication.git
- 安装 Rust 包
cargo build
(返回顶部)
用法
该库提供了两个主要函数,save_file
和 load_file
。 save_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。您也可以简单地打开一个带有“增强”标签的问题。别忘了给项目加星!再次感谢!
- fork项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m 'Add some AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 打开一个pull request
(返回顶部)
许可协议
在MIT许可证下分发。有关更多信息,请参阅LICENSE
。
(返回顶部)
联系
Anirudha - @4n1rudh4 - kulkarnianirudha8 [at] gmail [dot] com
依赖关系
~430KB