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

osh*_*nen 17 tar memory compression out-of-memory

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

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

是蜗牛邮件文件的最佳解决方案吗?

Cel*_*ada 27

评论中提供的其他信息表明 OP 正在使用 GUI 方法来创建.tar.gz文件。

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

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

tar czf foo.tar.gz foo
Run Code Online (Sandbox Code Playgroud)

foo包含所有 500 万个文件的目录在哪里。

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


pol*_*mon 15

“500 万”个文件,总共 1TB?那么您的文件必须非常小。我只是尝试rsync

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir
Run Code Online (Sandbox Code Playgroud)

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

7z a archive.7z /source/dir
Run Code Online (Sandbox Code Playgroud)

或者,如果您对7z至少尝试制作.tar.xz存档感到不舒服:

tar cJv archive.tar.xz /source/dir
Run Code Online (Sandbox Code Playgroud)

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


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

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

检查您的发行版是否atool在其存储库中,或者在工作场所环境中要求您的管理员安装它。

atool 安装一堆符号链接到自己,所以打包和解包变得轻而易举:

apack archive.tar.xz <files and/or directories>
Run Code Online (Sandbox Code Playgroud)

创建存档。

aunpack archive.7z
Run Code Online (Sandbox Code Playgroud)

展开存档。

als archive.rar
Run Code Online (Sandbox Code Playgroud)

列出文件内容。

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

  • 使用 `rsync` 的优点是,如果(当)连接中断,`rsync` 可以从中断的地方继续。 (4认同)
  • @NateEldredge 我通常认为大意味着&gt; 1GB。小通常&lt;1MB。这么小。 (4认同)
  • 这些文件平均为 200 KB。这还不算小。 (2认同)

Ant*_*hon 8

除非您可以比 25:1 压缩做得更好,否则您不太可能在发送蜗牛邮件之前从压缩中获得任何好处,除非您有一些可以与第三方交换的硬件磁带格式。

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

如果您无法匹配这些压缩数字,请使用普通光盘,将其复制并通过邮件发送给第三方。在那种情况下,运送比 1Tb 驱动器还小的需要压缩的东西简直是疯了。

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

  • +1:“永远不要低估一辆装满磁带的旅行车的带宽”(Andrew S. Tanenbaum)。见 https://en.wikipedia.org/wiki/Sneakernet (5认同)

LaX*_*LaX 6

你考虑过洪流吗?点对点可能是您通过 Internet 传输的最佳选择:

  • 至少与其他互联网传输一样快:您的上传速度将决定传输速度
  • 无数据损坏
  • 选择首先传输哪些文件
  • 无需额外的本地/云存储空间
  • 自由

您没有说明您使用的是哪个操作系统,但是当您谈到 tar.gz 压缩时,我假设您使用的是一些类似 GNU/Linux 的操作系统。为此,我会建议传输。它是一个在 Mac 和 Linux 上运行的开源 Torrent 软件。我喜欢它,因为开发人员努力使其支持他们支持的每个 GUI 客户端:没有跨平台语言。

您可以将此方法与压缩结合使用,但是您将无法确定传输的各个部分的优先级。