【发布时间】:2021-09-01 15:47:21
【问题描述】:
我正在尝试使用R.utils::gzip 和data.table::fwrite 的compress = "gzip" 参数复制压缩文件的校验和,但我不断得到不同的结果。这是一个例子
library(data.table); library(R.utils); library(digest)
dt <- data.frame(a = c(1, 2, 3))
fwrite(dt, "r-utils.csv")
gzip("r-utils.csv")
fwrite(dt, "datatable-v1.csv.gz", compress = "gzip")
digest(file = "r-utils.csv.gz")
#> [1] "8d4073f4966f94ac5689c6e85de2d92d"
digest(file = "datatable-v1.csv.gz")
#> [1] "5d58f9eeefb166c6d50ac00f3215e689"
最初我虽然 fwrite 将文件名和时间戳存储在输出文件中(按照通常的 gzip 行为,没有 --no-name 选项),但情况似乎并非如此,因为我得到了对fwrite的不同调用中的相同校验和
fwrite(dt, "datatable-v2.csv.gz", compress = "gzip")
digest(file = "datatable-v2.csv.gz")
#> [1] "5d58f9eeefb166c6d50ac00f3215e689"
关于可能导致差异的任何想法?
PS。顺便说一句,未压缩文件的校验和是相同的
$ md5sum datatable-v1.csv
7e034138dc91aa575d929c1ed65aa67c datatable-v1.csv
$ md5sum r-utils.csv
7e034138dc91aa575d929c1ed65aa67c r-utils.csv
【问题讨论】:
-
"
fwrite正在将文件名和时间戳存储在输出文件中(按照通常的gzip行为......)" 似乎很离谱:fwrite写道将 CSV 格式的数据放入文件中,并将其命名为您提供的文件名。保存的时间戳由操作系统完成,与fwrite甚至R无关。gzip甚至不存储原始时间戳,它基于原始的前提“知道”原始名称name 是当前 gzip 后的名称,去掉了结尾的.gz。这些实用程序相对幼稚是有充分理由的:简单是一件好事。 -
问题出在你身上,因为你认为你需要能够从两个不同的压缩器以相同的输入获得完全相同的文件。对此从来没有任何保证。不同的压缩代码,不同设置的相同压缩代码,或相同设置的相同压缩代码的新版本,都可以合法地为相同的输入产生不同的输出。如果你认为你需要相同的输出,你只会无缘无故地感到沮丧和失望。如果您需要确保完整性,请检查解压缩数据,而不是压缩数据。
标签: r data.table gzip