Python:获取LZ4压缩文件对应的未压缩原始文件大小
Python lz4压缩文件快速获取原始未压缩大小方案
实现方法
你在压缩时传入的source_size会直接写入LZ4文件的帧头元数据中,仅需读取文件开头少量字节即可解析,无需读取整个10GB文件,耗时可控制在毫秒级。
单帧LZ4文件(lz4.frame.open默认生成格式)
import lz4.frame def get_original_size(compressed_file_path: str) -> int: # LZ4帧头最长为15字节,读足够解析元数据的长度即可 with open(compressed_file_path, 'rb') as f: frame_header = f.read(15) frame_info = lz4.frame.get_frame_info(frame_header) # 你压缩时指定的source_size会对应content_size字段 return frame_info['content_size']
多帧拼接LZ4文件
如果压缩文件由多个LZ4帧拼接而成,可累加每个帧的原始大小,同样无需解码实际内容:
def get_total_original_size(compressed_file_path: str) -> int: total_size = 0 with open(compressed_file_path, 'rb') as f: while True: header = f.read(15) if not header: break frame_info = lz4.frame.get_frame_info(header) total_size += frame_info['content_size'] # 跳过当前帧剩余内容,直接定位到下一帧起始位置 f.seek(frame_info['frame_size'] - 15, 1) return total_size
原理解释
lz4.frame.get_frame_info()不需要传入LZ4FrameFile对象,仅需传入帧头二进制内容即可完成元数据解析- 之前使用
lz4.frame.open(file).seek(0,2)耗时极长,是因为LZ4FrameFile的seek操作需要解码整个压缩流来计算未压缩数据的偏移量,10GB文件自然需要很长时间 - 你使用的Python 3.9.7、lz4 3.1.3版本完全兼容上述方法,无需升级依赖
内容的提问来源于stack exchange,提问作者smp55
相关产品推荐
相关产品推荐

