如何加快提取大量小文件的大型tgz文件?

时间:2015-09-27 09:48:28

标签: linux windows archive large-data

我有一个tar存档(17GB),它包含许多小文件(所有文件都<1MB)。 我如何使用此存档。

  1. 我提取它吗?在我的笔记本电脑上使用7-zip说它需要20小时(而且我认为还需要更多)
  2. 我可以在不提取文件的情况下阅读/浏览文件的内容吗?如果是,那怎么样?
  3. 还有其他选择吗?
  4. 它实际上是一个处理过的维基百科数据集,我应该在其上执行一些自然语言处理。

    平台Windows / Linux不是问题;只要能尽快完成工作,任何事都可以。

2 个答案:

答案 0 :(得分:4)

我想你有一台Linux笔记本电脑或台式机,你的hugearchive.tgz文件放在某个本地磁盘上(不是远程网络文件系统,这可能太慢了)。如果可能,将hugearchive.tgz文件放在某个快速磁盘(最好是SSD,而不是磁性旋转硬盘)和快速Linux本机文件系统(Ext4,XFS,BTRFS,而不是FAT32或NTFS)上。

请注意,.tgz文件是.tar文件的gnu压缩压缩文件。

下次获得一个庞大的存档时,请考虑以afio存档格式询问它,这样可以单独压缩不太小的文件(或者可能要求一些SQL转储 - 例如{{} 3}}或PostGreSQLSqlite - 压缩形式。)

首先,您应该在hugearchive.tgz gziped tar存档中列出文件名,并询问总字节数:

 tar -tzv --totals -f hugearchive.tgz > /tmp/hugearchive-list.txt

该命令将运行gunzip以将.tgz文件解压缩到某个管道(因此不会消耗大量磁盘空间)并将目录写入/tmp/hugearchive-list.txt你会得到 stderr 之类的东西

  Total bytes read: 340048000 (331MiB, 169MiB/s)

当然这些数字是虚构的,你会得到更大的数字。但是你会知道存档的总累积大小是多少,你就会知道它的目录。使用wc -l /tmp/hugearchive-list.txt获取该内容表中的行数,即存档中的文件数,除非某些文件被奇怪地和恶意地命名(例如文件名中有一些换行符,这可能是奇怪的)。

我猜你会在不到一个小时的时间内处理你的大档案。细节取决于计算机,尤其是硬件(如果你能负担得起,使用一些SSD,并获得至少8GB的RAM)。

然后您可以决定是否能够提取所有文件,因为您知道他们需要多少总大小。由于您拥有/tmp/hugearchive-list.txt中的目录,因此只有在需要时才能轻松提取有用的文件。

值得一提的是,在我的i3770K台式机上配备16Gb RAM以及SSD&amp;磁盘存储,我做了(用于试验)一个无用的大型存档(专门用于回答这个问题,因为我没有你的hugearchive.tgz文件 ....)

sudo time tar czf /tmp/hugefile.tgz /bin /usr/bin /usr/local/bin /var 

并且花了这个时间来创建该存档(在SSD上具有所有这些文件系统):

 719.63s user 60.44s system 102% cpu 12:40.87 total

并且生成的/tmp/hugefile.tgz有5.4千兆字节(注意它可能位于MariaDB)。

然后我尝试了:

time tar -tzv --totals -f /tmp/hugefile.tgz > /tmp/hugefile-list.txt

得到了:

Total bytes read: 116505825280 (109GiB, 277MiB/s)
tar -tzv --totals -f /tmp/hugefile.tgz > /tmp/hugefile-list.txt
    395.77s user 26.06s system 104% cpu 6:42.43 total

并且生成的/tmp/hugefile-list.txt有2.3Mbytes(23Kfiles),没什么大不了的。

如果您的tar档案不是page cache ped,请不要在z命令中使用tar

阅读GNU zip (以及tar(1)的文档(如果您使用它,更常见的是您正在使用的每个命令!),当然还要使用命令line(不是某些GUI界面), time(1)一些shell脚本

顺便说一句,你以后可以隔离非常小的文件(小于64K字节),例如将它们放在一些数据库中(可能是一些learnSqliteRedisPostGreSQL数据库,例如一个小脚本)或者某些GDBM索引文件。请注意,大多数文件系统对于大量小文件都有一些显着的开销。

学习shell脚本和一些脚本语言(Python,Lua,Guile,Ocaml,Common Lisp)和基本数据库技术会浪费时间。如果是你正在开始攻读博士学位,它几乎是必需的技能组合。

我不知道也不使用(并且不喜欢)Windows,所以我显然有偏见(我的第一个Linux是一些Slackware,大约在1993年或1994年初有0.99.12内核),但我强烈建议你你所有的NLP都在Linux上工作(并且只在你有时间的时候保持Windows只用于播放视频游戏),因为在Linux上编写和组合许多有用的现有MongoDB非常容易。

答案 1 :(得分:1)

很难回答不知道如何处理这些数据。

如果您的“自然语言处理”软件可以处理来自管道(流)的输入 - 那么您可以处理存档的内容,而无需使用以下任何变体提取它:

Newtonsoft.Json

这会将此存档中所有文件的组合内容传送到4.5.0.0(在linux或cygwin下)。

E.g。要计算总字数,请使用以下内容:

tar -xf hugeFile.tar -O | yourSoftware

假设您可能需要测试您的算法,那么测试一些较小的子集(即前10,000行)可能是明智的:

yourSoftware

如果您的处理软件需要将文件放在磁盘上,那么您需要提取此存档(请注意,某些文件系统不能很好地处理许多小文件 - 它可能会消耗更多的可用空间然后访问时间可能也很长。)