压缩传输大量小文件(总共1TB)时的内存问题

压缩传输大量小文件(总共1TB)时的内存问题

我有 500 万个文件,占用了大约 1TB 的存储空间。我需要将这些文件传输给第三方。

最好的方法是什么?我尝试使用 .tar.gz 减小大小,但即使我的计算机有 8GB RAM,我也会收到“系统内存不足”错误。

通过蜗牛邮件发送文件是最好的解决方案吗?

答案1

注释中提供的附加信息表明 OP 正在使用 GUI 方法来创建文件.tar.gz

GUI 软件通常比等效的命令行等效软件包含更多的臃肿内容,或者为了某些“额外”功能(例如进度条)而执行额外的不必要的任务。如果 GUI 软件试图收集内存中所有文件名的列表,我不会感到惊讶。没有必要为了创建档案而这样做。专用工具绝对targzip为处理流输入和输出而设计的,这意味着它们可以处理比内存大得多的输入和输出。

如果您避免使用 GUI 程序,您很可能可以使用完全正常的日常tar调用来生成此存档,如下所示:

tar czf foo.tar.gz foo

其中foo是包含所有 500 万个文件的目录。

这个问题的其他答案为您提供了一些额外的替代tar命令来尝试,以防您想将结果分成多个部分等......

答案2

“五百万”个文件,总共 1TB?那么你的文件一定非常小。我只想尝试rsync

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

如果您没有,或者您的用例不允许使用rsync,我至少会检查是否7z适用于您的数据。可能不会,但我认为仍然值得一试:

7z a archive.7z /source/dir

或者,如果您觉得不舒服,7z至少尝试制作一个.tar.xz存档:

tar cJv archive.tar.xz /source/dir

(应该注意的是,旧版本的tar不创建.tar.xz档案,而是.tar.lzma在使用开关时创建档案J。即使是旧版本的tar,也不J完全支持该标志。)


由于您使用 GUI 程序来创建这些文件,我假设您对使用命令行界面感到有点不舒服。

为了方便从命令行界面创建、管理和提取档案,有一个名为的小实用程序atool。它几乎适用于我见过的每一个常见发行版,并且几乎适用于我偶然发现的每一个档案,除非那些极其晦涩难懂的档案。

当它位于工作环境中时,检查您的发行版是否已atool在其存储库中,或要求您的管理员安装它。

atool为其自身安装一堆符号链接,因此打包和解包变得轻而易举:

apack archive.tar.xz <files and/or directories>

创建档案。

aunpack archive.7z

扩展档案。

als archive.rar

列出文件内容。

创建什么样的存档,可以atool通过命令行中存档的文件扩展名来识别。

答案3

除非您能做到比 25:1 更好的压缩,否则您不太可能在邮寄之前通过压缩获得任何好处,除非您有某种可以与第三方交换的硬件磁带格式。

最大的常见存储是蓝光,大约可以提供 40Gb。您需要对数据进行 25 比 1 的压缩才能使其适合该数据。如果您的第三方只有 DVD,您需要 125:1(大约)。

如果您无法匹配这些压缩数字,只需使用普通光盘,将其复制并邮寄给第三方。在这种情况下,运输小于 1Tb 驱动器且需要压缩的东西是疯狂的。

您只需将其与使用ssh -C(标准压缩)或最好rsync使用压缩进行比较即可通过网络复制文件,无需预先压缩和 tar。 1Tb通过网络传输并不是不可能,但是需要一段时间。

答案4

7z是我的选择。它允许自动分割档案并支持多线程压缩。不,xz不,不管帮助消息怎么说。尝试使用:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

输出被分成 100MB 块(用开关更改-v)。

唯一真正的缺点是 7z 不保留 unix 元数据(例如权限和所有者)。如果您需要,请tar通过管道输出7za(请参阅man 7za一些示例)。

相关内容