【问题标题】:gzip and pipe to output (performance consideration)gzip 和管道输出(性能考虑)
【发布时间】:2015-06-19 07:55:30
【问题描述】:

q1) 我可以检查我是否做 gzip -c 文件 |加密(一些参数)

a) gzip 是否逐行打印输出并将其通过管道传递给 encrypt 函数或

b) gzip 将首先执行,然后输出将一次性通过管道传输到 encrypt 函数?

================================================ =====

q2) 将执行 gzip |加密比 gzip 有更好的性能考虑,然后加密

问候, 菜鸟

【问题讨论】:

  • 我认为lines 的概念不适用于压缩流。对于第二部分,您始终可以对数据进行比较:time <command>。通过管道执行应该是最好的选择,因为后者需要创建一个中间文件。

标签: linux unix encryption gzip solaris


【解决方案1】:

Gzip 是一种流式压缩器/解压缩器。因此(对于足够大的输入)压缩器/解压缩器在看到整个输入之前就开始写入输出。

这就是将 gzip 压缩用于 HTTP 压缩的原因之一。发件人可以在生成内容的同时进行压缩;接收者可以解压内容的第一部分,同时接收其余部分。

Gzip 不能“逐行”工作,因为它不知道一行是什么。但它确实可以“逐块”工作,其中压缩器定义了块的大小。

“绩效”这个词太模糊,领域太复杂,无法给出是或否的答案。

使用gzip -c file | encrypt,对于足够大的文件,将看到encryptgzip 同时工作。也就是说,encrypt 将加密第一个压缩块之前 gzip 压缩最后一个文件块。

【讨论】:

  • 我在哪里可以阅读更多关于 gzip 是基于流的压缩器/解压缩器的信息,请原谅我的无知,直到在这里发布问题之前我才知道这一点。
  • 我不确定你想知道什么样的事情。这并不是真正写下来的东西,因为流是 UNIX 工具在可能时工作的“正常”方式。
  • 您能否进一步详细说明什么是流 -> 您的意思是数据“倒入”gzip 并从 gzip 中“流出”吗?但是谁和什么决定了有多少数据进出?
  • @Noob 所有“流式传输”的意思是程序在读取和写入之间交替。因此,您在完成消耗输入之前就开始获取输出。大多数 UNIX 实用程序都这样做。例如grep 在读取后立即写入匹配行。那些不这样做的人,这样做是因为他们做不到。比如从stdin读取sort无法知道最后一行不会是aardvark,所以在输入关闭之前无法开始写入。
【解决方案2】:

管道缓冲区的大小取决于实现。在 SunOS 下,它是 4kB。即:gunzip < file.gz | encrypt 将移动 4k 块。同样,它取决于操作系统。 CygWIN 的行为可能完全不同。

我应该补充一点,这是在man 7 pipe。搜索 PIPE_BUF

【讨论】:

  • 是的,管道缓冲区是 4kB,但是 gzip 或 gunzip 每次会“注入”多少管道?如果管道缓冲区未满(还没有 4kB),管道是否会将其缓冲区重定向到管道的另一侧?
  • gunzip 进程将被阻塞,直到阅读器清空其一侧的管道。是这个意思吗?
  • 我的意思是在 gzip -c 文件中 |加密,你提到管道的大小是4k,但是gzip -c文件每次输出多少呢?
  • 我不知道 gzip 是如何实现的,但我猜它与它使用的字典的大小有关。出于程序员的目的,您可能永远不会知道(或关心)。例如,通常会执行以下操作:gzcat <file.tar.gz | tar tf - 在这种情况下,gzcattar 都不关心管道的大小。它们将简单地读/写,直到它们阻塞,然后在 I/O 可用时恢复。这有帮助吗?
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多