3个不稳定版本

0.2.1 2024年2月20日
0.2.0 2024年2月6日
0.1.0 2022年10月13日

压缩 类别中排名 #52

Download history 37/week @ 2024-03-30 9/week @ 2024-04-06 3/week @ 2024-04-20 8/week @ 2024-05-18 2/week @ 2024-05-25 4/week @ 2024-06-01 3/week @ 2024-06-08 109/week @ 2024-07-13

每月下载 109

MIT 许可证

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