AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 687386
Accepted
xander
xander
Asked: 2022-01-22 14:09:43 +0800 CST2022-01-22 14:09:43 +0800 CST 2022-01-22 14:09:43 +0800 CST

gzip -t 可以检测 100% 的截断下载错误吗?

  • 772

场景:单个 1g CSV.gz 正在写入 FTP 文件夹。同时,我的客户端机器通过 sFTP 连接到该文件夹​​并尝试将其拉下。

问:在获取该文件后,无论我在客户端获得任何明显的长度,都可以gzip -t检测到部分文件并使部分文件失败,而不管截断在哪里?

我认为当片段突然结束时,解压缩或 -t'esting 会在 99% 的可能截断点上出错,但是 gz 结构是否有干净的切割点,gzip 会意外报告成功?

不在桌面上的缓解措施(因为如果其中一个在起作用,我不需要问上面的问题。)

  1. 通过另一个网络请求获取文件长度或 md5。
    1. 通过 FTP 轮询文件长度并不是很好,因为服务器可能会偶尔将块写入 zip 流。在批处理作业关闭文件句柄之前,将其误认为是完整的数据集对我的分析来说是致命的。
    2. 由批处理作业给出最终文件长度或散列消除了对这个 Q 的需要,但这给团队带来了实施负担,(对于这个 Q 的目的),可能不存在。
  2. 我们无法通过安排一天中不同时间的读/写来避免竞争。
  3. 服务器未使用原子移动操作。
  4. 我不知道 CSV 行/列计数;它会随着每个快照和每个集成而改变。也可以说被 gzip 压缩的文件是这个 Q 的不透明二进制 blob。
  5. 没有客户端=> sFTP 网络错误在起作用。(那些被捕获和处理;我担心的是读取一个在服务器批处理作业期间仍然偶尔写入的文件。)
  6. 使用 RESTful API 而不是 sFTP。

没有找到现有的 SO

一些 SO 涉及处理截断,但与需要在任何问题上可靠地使整个工作流程失败相比,它们处于有损可接受的上下文中。(我在医疗数据环境中进行计算,所以我宁愿让服务器停止并着火,也不愿传播不正确的统计数据。)

  • gzip:文件意外结束 - 无论如何如何读取文件是相反的 - 他们希望抑制 EOF 错误,因为这对他们的用例来说不是问题
  • 为什么在使用 gzip 时我的脚本中出现意外的文件结尾?只是 posix 流的结尾是故意插入的,head并且没有涵盖“是否有可能出现误报?”
  • zcat / gzip error while pipe out is very close,但不问“我保证会得到这个错误吗?”
  • 合并可能被截断的 gzipped 日志文件也很接近,因为它处理来自终止的批处理作业的部分文件,但仍然是丢弃一些不可读的行,而不是保证错误。
gzip
  • 1 1 个回答
  • 366 Views

1 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2022-01-22T15:23:20+08:002022-01-22T15:23:20+08:00

    gzip 格式的文件包含压缩数据的长度和未压缩数据的长度。然而,这是一种古老的格式,长度字段只有 32 位,所以现在它们被解释为长度模 2^32(即 4 GiB)。解压前gzip检查压缩数据的校验和是否正确。解压后,gzip检查解压数据的校验和是否正确,解压数据的大小是否正确模2^32。

    因此,如果压缩数据的大小(或解压缩数据的大小)小于 4 GiB,则 gzip 可以保证检测到截断的输入。但是,对于任意大小的文件,我看不出这些检查是否足够的任何理由。如果输入不是故意设计的,并且其长度以 4 GiB 为模均匀分布,则压缩长度和校验和匹配的几率只有 1/2^64,如果文件在多字节序列的中间或者如果未压缩数据的长度不匹配。(这并不一定会将机会减少到 1/2^96,因为压缩长度模 2^32 和未压缩长度模 2^32 是相关的。)所以只有很小的机会出现未检测到的错误,但它是非零的,和我'

    请注意,此分析仅适用于 gzip 压缩文件由单个流组成的情况。gunzip可以解压缩由多个连接的流组成的文件,并且无法检测文件是否包含有效的流序列,但需要更多的流。但是,您的生产链可能不会生成多流文件:gzip不会自己生成,您必须手动连接多次运行的输出,或者使用其他工具(pkzip?)。

    服务器未使用原子移动操作。

    不幸的是,我认为没有一种完全可靠的方法来检测错误,而无需在服务器完成写入后计算的外部元数据(长度或加密校验和)。

    • 3

相关问题

  • 我的wget怎么会缺少--compression?

  • 如何将 tar 文件转换为 tgz 文件?

  • 使用偏移量读取部分下载的 gzip

  • 为什么 gzip 不创建相同大小的文件?

  • 解压缩文件夹中的 *.Z 文件返回错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve