基于文件类型的LZMA压缩估算魔数技术求助
估算.tar.xz压缩后大小的实用压缩比例参考
以下是基于xz默认压缩级别(级别6)的经验压缩比例,可直接替换你代码中的“魔数”,满足存储空间预校验的需求:
- 已压缩/多媒体文件:压缩比设为
1.0,这类文件本身已经经过压缩(如.zip、.jpg、.mp4、.docx),xz几乎无法再压缩,甚至可能因tar元数据略微增大。 - 纯文本/代码文件:压缩比设为
0.2,纯文本冗余度极高,xz的LZMA2算法压缩效果显著,普通代码或文档类文本的实际压缩比通常在0.1~0.3区间。 - 二进制可执行文件:压缩比设为
0.4,这类文件有一定冗余但低于文本,比如Windows的.exe或Linux的.so文件,实际压缩比在0.3~0.5之间。 - 原始数据/未压缩位图:压缩比设为
0.1,比如.raw传感器数据、.bmp位图,这类文件几乎无压缩,xz能大幅压缩,实际比例在0.05~0.2区间。 - 未知类型文件:保留你的默认值
0.65,覆盖所有未匹配到的文件类型,作为中间估算值。
优化后的代码示例:
from pathlib import Path def estimateCompressionSize(filePath: Path) -> int: if filePath.is_dir(): total_size = 0 for item in filePath.rglob("*"): total_size += estimateCompressionSize(item) return total_size ext = filePath.suffix.lower() # 已压缩/多媒体文件:几乎无法再压缩 if ext in (".zip", ".7z", ".rar", ".jpg", ".jpeg", ".png", ".gif", ".mp4", ".mp3", ".flac", ".docx", ".xlsx"): comp_ratio = 1.0 # 纯文本/代码文件:高压缩比 elif ext in (".txt", ".py", ".js", ".html", ".css", ".md", ".csv", ".json", ".xml"): comp_ratio = 0.2 # 二进制可执行文件/编译产物 elif ext in (".exe", ".dll", ".so", ".bin", ".elf"): comp_ratio = 0.4 # 原始数据/未压缩位图 elif ext in (".raw", ".dat", ".bmp"): comp_ratio = 0.1 # 其他未知类型:中间估算值 else: comp_ratio = 0.65 return int(filePath.stat().st_size * comp_ratio)
补充说明:如果使用xz的更高压缩级别(如级别9),可适当下调对应比例(比如文本类调到0.15);若用更低级别则上调。这些比例是经验值,虽然无法做到100%精确,但用于预校验存储空间完全足够——毕竟你只需要判断是否有足够空间,不需要精确到字节。
内容的提问来源于stack exchange,提问作者Anna-Rose




