R中使用data.table与R.utils生成gzip文件MD5校验和不一致问题
问题原因
这是正常现象,两份gzip压缩文件MD5不一致但解压后内容完全一致,本质是两个函数生成gzip文件时使用的压缩配置、头部元数据存在差异,和原始数据的一致性无关,具体原因如下:
- 压缩级别不一致
R.utils::gzip()默认的压缩级别为6(兼顾压缩率和速度),而data.table::fwrite()的内置gzip压缩默认优先保证写入速度,使用的是更低的压缩级别(通常为1)。不同压缩级别下,zlib对完全相同的原始数据生成的压缩二进制流本身就会有差异,最终文件的MD5自然不同。 - gzip头部元数据差异
你测试发现多次调用fwrite生成的压缩文件MD5一致,说明fwrite生成gzip时固定了头部的时间戳字段(一般填0),也没有写入原始文件名等动态元数据。
而R.utils::gzip()默认会在gzip头部写入原始文件的修改时间、原始文件名等信息,这部分元数据的差异也会直接导致最终压缩文件的MD5不同。
验证方法
你可以手动对齐两个函数的压缩配置、关闭动态元数据写入后再做对比,示例如下:
# R.utils::gzip 关闭时间戳、文件名写入,指定压缩级别为6 gzip("r-utils.csv", timestamp = FALSE, fname = "", compression_level = 6, overwrite = TRUE) # fwrite 对齐压缩级别,关闭gzip元数据写入 fwrite(dt, "datatable-v3.csv.gz", compress = "gzip -n -6") # 此时再对比MD5会完全一致 digest(file = "r-utils.csv.gz") digest(file = "datatable-v3.csv.gz")
只要解压后的原始CSV文件MD5一致,就说明两份压缩文件存储的原始数据完全相同,压缩文件本身的MD5差异不代表数据存在问题,不需要额外处理。
内容的提问来源于stack exchange,提问作者fjuniorr
相关产品推荐
相关产品推荐

