我想将大量数据(数百个原始 pcap 文件,每个 1Gb)上传到 AWS。我为此使用了 aws s3 sync。pcap 数据具有高度可压缩性,但我不想在第一步进行压缩,等待压缩,然后再上传。相反,我希望文件在“运行中”进行压缩,就在 aws cli 第一次请求/读取它们时进行压缩。
是否有一些 Linux/posix 文件系统魔法可以实现这样的功能?这种方法似乎很新颖,因为它将压缩文件“隐藏”为普通文件,因此任何可以处理文件的现有工具都可以从中受益。
我查看了 mkfifo,但无法找到合适的解决方案。
原因是什么?我们的目标是实现更高的网络上传带宽,并降低 S3 上的存储成本。
我发现有两个项目正是这样做的。
fusecompress
是一个废弃的项目,但在我的快速测试中似乎运行良好。支持 lzo/bz2/gz/lzma。我发现了两个版本,一个用C 编写(旧版本,取自 Google Code),另一个用C++ 编写(较新),显然是由同一个人编写的。后者似乎是可以使用的。fuse-zstd
是一个较新的项目,似乎得到了积极维护。使用 zstd(压缩和解压缩速度都很快,效果几乎与 lzma 一样好)。fusecompress
似乎使用自定义文件格式,占用更多空间(我猜是为了允许更快的随机访问),而fuse-zstd
使用简单的 zstd 文件(随机访问性能可能很糟糕?)。您应该尝试这两种方法,这样您就可以决定哪一种最适合您。无论如何,请保留未压缩的文件备份,以防万一。
文件系统可能会压缩文件系统内部的数据以节省空间,但文件系统的要点是“输入的数据就是输出的数据”。您的 aws s3 sync 进程将看到原始数据,而不是压缩文件。
因此,您不会在 POSIX 层获得任何东西来执行此操作。
您可以编写一个在后台运行的进程,使用 inotify 检测正在创建的新文件并对其进行压缩。然后您的同步进程就可以查找压缩文件。或者您可以编写一个 FUSE 文件系统,在数据到达时对其进行压缩,并将其用作覆盖文件系统...
因此,虽然有选择,但并不是“开箱即用”。
我们不知道您如何上传文件(使用哪种工具)。但是:
scp
有一个-c
即时压缩的选项;gzip -c original_file | uploading_command -specific_option destination_file
。