我尝试执行以下操作:
- 上传一个文件夹(比如图片)到服务器上
- 让服务器压缩输入流并将其保存到文件中
重要的是,步骤 1) 应该是未压缩的因为连接速度非常快,并且我认为客户端的压缩会更慢。进一步地,服务器才不是具有足够的空间来存储目录而无需压缩。理想情况下,服务器上的压缩是同时发生的。
我不太关心实际的压缩算法,只要它是多线程的即可。
答案1
初步说明:假设您的图片已经被压缩(JPEG、PNG、WEBP...),无论您使用哪种压缩,就空间而言,无能为力。根本就没有熵可以减少了。所以,你的整个计划可能会失败。
通常的方法是使用磁带存档格式(.tar)。您可以将目录序列化为单个 TAR 流,通过互联网(例如使用 SSH)传输该目录并将其压缩到目标上。
您还需要关闭 SSH 的内置传输压缩,否则一开始就不在发送主机上进行压缩是没有意义的。
就像是
tar c Pictures/ | ssh -o "Compression=no" user@server "zstd -15 -T0 > Pictures.tar.zstd"
zstd -T0
将(使用尽可能多的 CPU 核心进行 zstandard 压缩;这-15
是压缩级别;15 非常残酷,-3
比 gzip 更好,但通常更快)替换为xz -T0
(对于并行 XZip 压缩)或pigz
(对于并行 gzip 压缩)为你觉得合适。我确实推荐 zstd,它具有非常好的压缩比/速度权衡;xz
速度相当慢,并且 gzip 只能产生非常有限的压缩,并且在相对较低的压缩设置下并不比 zstd 快。
但请注意,数据加密可能比压缩需要更多的 CPU,所以问题实际上是为什么你不只是
zstd -r --stdout Pictures/ | ssh -o "Compression=no" user@server "cat > Pictures.zst"
答案2
您可以使用压缩文件系统来完成此操作。
例如,Btrfs 或 ZFS - 只需将一个卷定义为在主机上压缩即可满足您的要求。