3个不稳定版本
0.2.1 | 2024年2月20日 |
---|---|
0.2.0 | 2024年2月6日 |
0.1.0 | 2022年10月13日 |
在 压缩 类别中排名 #52
每月下载 109 次
130KB
3K SLoC
什么是arx
Arx是基于jubako容器格式的文件归档格式。
它允许您创建、读取、提取文件归档(就像zip或tar所做的那样)。
Arx(以及Jubako)处于积极开发中。虽然它表现相当不错,但我不建议用它来备份。然而,您可以用来传输数据或探索归档。
工作原理
Jubako是一种多功能的容器格式,允许以结构化的方式存储数据,压缩或不压缩。它的主要优势(除了其多功能性之外)是它被设计为允许快速从归档中检索数据,而无需解压缩整个归档。
Arx使用jubako格式并创建arx归档,该归档
- 存储压缩的文件数据。
- 使用目录/树结构存储文件。
- 可以在arx归档上执行随机访问以获取特定文件
- 允许挂载归档以探索和使用(只读)归档中的文件,而无需解压缩。
安装arx
适用于Windows、MacOS和Linux的二进制文件在每个版本中可用。您还可以使用Cargo安装arx
cargo install arx
使用arx
创建归档
创建归档很简单
arx create -o my_archive.arx -r my_directory
它将是一个文件:my_archive.arx
,其中将包含my_directory
目录。
提取归档
提取(解压缩)归档使用
arx extract my_archive.arx -C my_out_dir
列出归档的内容
您可以使用以下方式列出归档的内容(归档中的文件列表)
arx list my_archive.arx
如果您只想访问单个文件的内容
arx dump my_archive.arx my_directory/path/to/my_file > my_file
# or
arx dump my_archive.arx my_directory/path/to/my_file -o my_file
挂载归档
在Linux上,您可以使用fuse挂载归档。
mkdir mount_point
arx mount my_archive.arx mount_point
arx
将在您卸载mount_point
之前运行。
将zip归档转换为arx归档
zip2arx -o my_archive.arx my_zip_archive.zip
将tar归档转换为arx归档
tar2arx -o my_archive.arx my_tar_archive.tar.gz
性能
以下比较了Arx与不同存档格式的性能。
- Arx、Tar、Squashfs使用zstd,第5级压缩内容。
- Zip使用第9级压缩
- Fs是文件系统(非存档)。存档创建和提取是通过
cp -a
模拟的。
在不同的数据集上进行了测试
- 整个Linux内核(linux-5.19)
- Linux内核中的驱动程序目录
- Linux内核中的文档目录
源目录存储在sdd上。所有测试都在tmpfs上运行(存档和提取的文件存储在内存中)。
挂载差异时间是挂载存档与源目录diff的时间
arx mount archive.arx mount_point &
time diff -r mount_point/linux-5.19 linux-5.19
umount mount_point
使用archivemount
工具挂载tar存档。
Linux文档
仅Linux源代码的文档目录
类型 | 创建 | 大小 | 提取 | 列出 | 转储 | 挂载差异 |
---|---|---|---|---|---|---|
Arx | 191ms521μs | 10.81 MB | 82ms356μs | 3ms244μs | 12s635ms | 257ms541μs |
FS | 151ms691μs | 38.45 MB | 86ms122μs | 8ms500μs | 1s965ms | 75ms854μs |
Squashfs | 106ms330μs | 10.60 MB | 78ms341μs | 3ms963μs | 12s519ms | 273ms466μs |
SquashfsFuse | 93ms131μs | 10.60 MB | 64ms212μs | 4ms100μs | 11s867ms | 724ms92μs |
Tar | 132ms570μs | 9.68 MB | 65ms358μs | 43ms247μs | 1m58s | 2m44s |
Zip | 1s47ms | 15.22 MB | 318ms528μs | 25ms970μs | 41s219ms | 2m37s |
这是时间比/ Arx时间比。大于100%的比率表示Arx更好。
类型 | 创建 | 大小 | 提取 | 列出 | 转储 | 挂载差异 |
---|---|---|---|---|---|---|
FS | 79.20% | 355.58% | 104.57% | 246.76% | 15.56% | 29.45% |
Squashfs | 55.52% | 98.05% | 95.12% | 122.16% | 99.09% | 106.18% |
SquashfsFuse | 48.63% | 98.05% | 77.97% | 126.39% | 93.93% | 281.16% |
Tar | 69.22% | 89.53% | 79.36% | 1333.14% | 938.65% | 63823.89% |
Zip | 547.15% | 140.80% | 386.77% | 773.64% | 326.23% | 61193.99% |
Linux驱动程序
仅Linux源代码的驱动程序目录
类型 | 创建 | 大小 | 提取 | 列出 | 转储 | 挂载差异 |
---|---|---|---|---|---|---|
Arx | 1s759ms | 98.23 MB | 771ms186μs | 7ms849μs | 47s190ms | 1s348ms |
FS | 725ms460μs | 799.02 MB | 437ms409μs | 15ms937μs | 6s938ms | 437ms479μs |
Squashfs | 862ms771μs | 121.70 MB | 416ms41μs | 9ms565μs | 46s219ms | 1s419ms |
SquashfsFuse | 858ms708μs | 121.70 MB | 401ms922μs | 9ms691μs | 46s462ms | 3s680ms |
Tar | 1s266ms | 97.96 MB | 604ms497μs | 605ms814μs | 1h24m | 3h |
Zip | 20s74ms | 141.91 MB | 3s431ms | 88ms115μs | 6m10s | 47m35s |
这是时间比/ Arx时间比。大于100%的比率表示Arx更好。
类型 | 创建 | 大小 | 提取 | 列出 | 转储 | 挂载差异 |
---|---|---|---|---|---|---|
FS | 41.22% | 813.39% | 56.72% | 203.04% | 14.70% | 32.45% |
Squashfs | 49.03% | 123.88% | 53.95% | 121.86% | 97.94% | 105.31% |
SquashfsFuse | 48.79% | 123.88% | 52.12% | 123.47% | 98.46% | 272.96% |
Tar | 71.97% | 99.72% | 78.39% | 7718.36% | 10737.76% | 803710.62% |
Zip | 1140.71% | 144.47% | 444.96% | 1122.63% | 786.06% | 211770.34% |
Linux源代码
类型 | 创建 | 大小 | 提取 | 列出 | 转储 | 挂载差异 |
---|---|---|---|---|---|---|
Arx | 3s324ms | 170.68 MB | 1s236ms | 12ms992μs | 1m58s | 2s839ms |
FS | 1s591ms | 1.12 GB | 992ms53μs | 40ms451μs | 17s997ms | 878ms367μs |
Squashfs | 1s481ms | 201.43 MB | 673ms843μs | 23ms137μs | 2m2s | 2s905ms |
SquashfsFuse | 1s471ms | 201.43 MB | 646ms649μs | 24ms709μs | 2m2s | 13s8ms |
Tar | 1s663ms | 168.77 MB | 1s48ms | 739ms526μs | - | - |
Zip | 31s261ms | 252.96 MB | 5s936ms | 217ms510μs | - | - |
这是时间比/ Arx时间比。大于100%的比率表示Arx更好。
类型 | 创建 | 大小 | 提取 | 列出 | 转储 | 挂载差异 |
---|---|---|---|---|---|---|
FS | 47.86% | 674.89% | 80.25% | 311.35% | 15.17% | 30.94% |
Squashfs | 44.57% | 118.02% | 54.51% | 178.09% | 103.05% | 102.35% |
SquashfsFuse | 44.28% | 118.02% | 52.31% | 190.19% | 103.52% | 458.16% |
Tar | 50.04% | 98.88% | 84.80% | 5692.16% | - | - |
Zip | 940.47% | 148.21% | 480.25% | 1674.18% | - | - |
内核编译是编译整个内核所需的时间,默认配置为(-j8)。对于arx,我们使用挂载在mount_point中的存档中的源代码来编译内核。
内核编译是在“真实”条件下进行的。源代码或arx存档存储在ssd上。
类型 | 编译 |
---|---|
Arx | 40m |
FS | 32m |
Arx存档比tar.zst存档大(约1%)但比squashfr小15%。Arx的创建和完全提取时间略长,但时间相当。
列出文件是通过存档访问单个文件,使用arx或squash访问单个文件要快得多。访问时间几乎不受存档大小的限制。然而,对于tar,访问单个文件的时间会随着存档大小的增加而大大增加。
挂载arx存档可以使存档可用而无需提取它。与两个目录之间的普通diff相比,简单的diff -r
需要多4倍的时间,但它是一个特定的用例(按顺序且仅访问一次所有文件)。
但对于Linux文档来说,arx比tar快444倍(几个小时)。tar存档越大,这个比率就越大。我还没有尝试对整个内核进行mount-diff。
对于内核编译,开销约为25%。但从另一方面来说,您可以在不将1.3GB的源代码存储在硬盘上的情况下编译内核。
依赖关系
约20-33MB
约532K SLoC