在命令行中,如何告诉 7-Zip 禁用新的(23.00 中)ARM64 过滤器?

0xC*_*22L 5 7-zip

问题

我如何教导 7-Zip(特别是命令行版本7z)我只想禁用 ARM64 过滤器,但所有其他过滤器都是可以接受的?

我现在的目标是在较新的 7-Zip 版本中禁用 ARM64 过滤器,保持与较旧的 7-Zip 版本的兼容性。

背景

7-Zip 23.00 引入了针对同名架构的二进制文件的 ARM64 过滤器。摘自history.txt

23.00 2023-05-07

  • 7-Zip 现在可以使用新的 ARM64 过滤器压缩为 7z 和 xz 档案。ARM64 过滤器可以提高包含为 ARM64 (AArch64) 架构编译的可执行文件的数据的压缩率。此外,7-Zip 现在会在压缩之前解析可执行文件(具有 exe 和 dll 文件扩展名),并为每个解析的文件选择适当的过滤器:
    • x86 可执行文件的 BCJ 或 BCJ2 过滤器,
    • ARM64 可执行文件的 ARM64 过滤器。以前的版本默认对所有 exe/dll 文件使用 x86 过滤器 BCJ 或 BCJ2。

这实际上引入了向后不兼容性。每当要求旧版本的 7-Zip 处理使用 23.00 或更高版本创建包含 ARM64 二进制文件的文件时,输出将类似于:

Method = 0A LZMA2:26 LZMA:20 BCJ2 ARMT
Run Code Online (Sandbox Code Playgroud)

...而在新版本中我们可以看到这0A转化为ARM64

Method = ARM64 LZMA2:26 LZMA:20 BCJ2 ARMT
Run Code Online (Sandbox Code Playgroud)

我尝试过的&“基准”

虽然我可以告诉它专门-mf=BCJ2使用指定的过滤器,或者我可以关闭所有过滤器,但这似乎都不是我想要的。关闭所有过滤器意味着更差的压缩比。在任何地方仅打开特定的过滤器意味着压缩速度较慢。-mf=off

比较(为所有测试预先填充文件系统缓存):

  • 像以前一样切换:yield Method = ARM64 LZMA2:26 LZMA:20 BCJ2 ARMT,在 36.620 秒内,大小为 115454049 字节 (111 MiB)
    • -t7z -mx=9 -myx=7 -mmt=on -mmtf=on -ms=on -mqs=on -mtm=off -mtc=off -mta=off -mtr=off -stl
  • 附加-mf=off: 产量Method = LZMA2:26,在 37.692 秒内,大小为 116861788 字节(112 MiB)
  • 附加-mf=BCJ2: 产量Method = LZMA2:26 LZMA:20 BCJ2,在 36.031 秒内,大小为 115483281 字节(111 MiB)

显然,对于我的示例(这是我实际尝试的一个较小的子集),两者之间的大小和性能差异-mf=BCJ2足够小。但对于我正在处理的数据的实际大小,我们正在进入这些汇总的区域。