压缩和传输大量小文件(总计1TB)时出现内存问题


15

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

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

是将文件蜗牛发送过来的最佳解决方案吗?


9
您在创建.tar.gz或复制生成的压缩文件时遇到问题吗?无论哪种方式,都有些奇怪,因为这两个操作都不会因为文件很大而消耗更多的内存。也就是说,两个操作都应该是流式的。请提供有关确切命令失败的更多信息。
Celada 2015年

1
您和第三方有多少带宽可用?幼稚的rsync可能会节省您的邮资。但是我不知道“五百万”文件将如何为您工作,因为rsync会尝试在内存中构建文件列表,如果list(5e6文件)> 8 GB,则可能。当然会很慢。
Kalvin Lee

2
@oshirowanen我不认为它应该消耗大量内存计算文件列表,因为我敢肯定,tar应该只是存档文件增量,因为它列出了他们,从来没有建立在内存中的列表。但同样,请显示您正在使用的确切命令。另外,所有文件都在同一目录中还是目录结构很深?
Celada 2015年

3
是的,很好的GUI程序通常在构建时并不十分重视可扩展性和健壮性等目标。如果这是GUI包装器/前端的错,这也不会令我感到惊讶。使用命令行创建文件,我想您会发现它的效果很好。
Celada 2015年

3
1 TB数据至少需要22个小时才能通过100 Mbit / s的宽带连接进行传输。因此,根据您希望实现的压缩程度,蜗牛邮件实际上可能是较快的选择。
2015年

Answers:


27

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

GUI软件通常比等效的命令行软件包含更多的膨胀,或者由于某些“额外”功能(例如进度条)而执行其他不必要的任务。如果GUI软件尝试收集内存中所有文件名的列表,这不会令我感到惊讶。无需执行此操作即可创建档案。专用工具targzip明确设计用于处理流输入和输出,这意味着它们可以处理比内存大得多的输入和输出。

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

tar czf foo.tar.gz foo

这里foo是包含所有的500万个文件的目录。

该问题的其他答案为您提供了两个其他替代tar命令,以供您尝试将结果分成多份等时使用...


15

“五百万”文件,总共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可以通过命令行中归档文件的扩展名来识别。


4
使用此方法的好处rsync是,如果(当)连接断开,则rsync可以在中断的地方进行连接。
roaima 2015年

2
这些文件的平均大小为200 KB。那还不算小。
Nate Eldredge 2015年

4
@NateEldredge我通常认为big大于1GB。小型通常小于1MB。好小
PythonNut

8

除非您做得比25:1的压缩效果好,否则除非在蜗牛硬件上可以交换第三方的某种硬件磁带格式,否则不可能在蜗牛邮件发送之前对其进行压缩。

最大的通用存储是蓝光,大约可以为您提供40Gb。您需要对数据进行25到1的压缩,以使其适应于此。如果您的第三方只有DVD,则需要125:1(大约)。

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

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


5
+1:“永远不要低估装满胶带的旅行车在高速公路上行驶的带宽”(Andrew S. Tanenbaum)。参见en.wikipedia.org/wiki/Sneakernet
Olivier Dulac 2015年

@OlivierDulac我已经看到过与波音747类似的构造,并且装满CDROM的盒子令人惊奇地发现,您可以获得那种吞吐量。
Anthon 2015年

我喜欢pidgin远胜ISP,请参见维基百科页面的示例^^
Olivier Dulac

6

您考虑过洪流吗?对等网络传输可能是您的最佳选择:

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

您没有告诉您使用的是哪个操作系统,但是在谈论tar.gz压缩时,我假设您正在使用某些类似GNU / Linux的操作系统。为此,我建议传输。这是一个在Mac和Linux上运行的开源torrent软件。我之所以喜欢它,是因为开发人员致力于使其成为支持的每个GUI客户端的本机:没有跨平台语言。

您可以将此方法与压缩结合使用,但是您将失去对传输的部分进行优先级排序的能力。


Torrent软件在压缩GUI软件时可能会遇到相同的问题。将文件名存储到内存等中。此外,torrent文件必须存储文件的元数据。应该将500万个文件名打包到torrent文件中。
Ayesh K 2015年

@AyeshK是的,这会在添加/创建种子或检查校验和时影响性能。不过,我相信这是用于传输大量数据的最稳定的解决方案。
LaX 2015年

根据洪流怪胎,有史以来最大的洪流共享约为800gb。大多数文件包含大约33K文件的单个torrent文件。但是500万个文件...我不确定。
Ayesh K 2015年

3

7z是我的选择。它允许自动拆分档案,并支持多线程压缩。xz不,尽管帮助消息中有说明,但不是。尝试:

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

输出分为100MB块(通过-v开关更改)。

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


1
The only real downside但是有个缺点!
njzk2

@ njzk2实际上取决于情况。例如,如果您要发送备份映像或数据库转储,则您可能不太在乎权限。
Stefano Sanfilippo

当您可以split在.tar.gz文件上使用并保留元数据时,我不太明白使用7z进行拆分的意义。
njzk2

@ njzk2 也会分裂。首先,它使用LZMA2进行多线程压缩。我知道没有其他的Unix实用程序支持它。7z还具有非固态压缩模式,当仅需访问该tar方法的特定文件时,这是一大进步。
Stefano Sanfilippo


3

我右键单击该文件夹,然后单击“创建档案”,然后选择.tar.gz选项。目录结构很深,超过500,000个目录

是的,祝你好运。而且GUI工具将尝试在相同的卷上执行此操作,这意味着a)您需要另外1Tb的可用空间,并且b)读取一个文件并将其附加到归档文件的头部跳动对于驱动器来说不会太健康。

我看到两种可能性:

1)从您的计算机到第三方的rsync。一个或另一个将需要一个不经常更改的全局IP地址。rsync 的巨大优势是,如果您由于任何原因而被打断,它都可以从中断处恢复。复制1Tb tarball是成功还是失败

2)购买一个1TB的外部驱动器,将其复制到其中,然后将驱动器交付。高延迟,但到达时确实带宽不错。各种在线备份服务对此进行了初始备份。



1

我建议您使用类似:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

它将创建10个文件,最大为100GB。但这无法解决您的“ OOM”问题,因为tar应该以流方式对其进行读写,因此瓶颈显然是gzip。


0

那个怎么样:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find 搜索列出目录树
  • tar -T - 从标准输入中读取列表
  • -czf -创建一个存档并写入stdout,z对流进行gzip
  • ssh remotehost 使用登录到remotehost ssh
  • cd /target/dir/ 转到目标目录
  • tar xzf - 从标准输入中提取输入流

漂亮的小片段。尽管我认为他的需求主要是压缩功能,但目的是“转移给朋友”
mveroone 2015年

如果由于网络中断(仍然有ISP每24小时将您断开一次连接)或网络中断而导致连接中断(在传输1 TB时并不太可能),则无法完全创建归档文件会造成伤害。
乔纳斯舍费尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.