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

问题描述:

我有一个tar归档文件(17GB),它由许多小文件组成(所有文件< 1MB)。 如何使用此存档。如何加速提取大量小文件的tgz文件?

  1. 我会提取它吗?在我的笔记本电脑上使用7-zip表示需要20小时(我认为这需要更多时间)
  2. 我可以在不提取文件的情况下读取/浏览文件的内容吗?如果是,那么如何?
  3. 有没有其他的选择?

它实际上是一个处理过的维基百科数据集,我应该在其上执行一些自然语言处理。

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

+0

所以它是一个包含许多'.zip'文件的'.tgz'文件?或者只是一个包含许多文本文件的'.tgz'文件? – vlp

+0

带有许多文本文件的'.tgz' – Vulcan

+0

那里有多少个文件?这听起来很奇怪,这样一个小文件需要很多时间...... –

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

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

tar -xf hugeFile.tar -O | yourSoftware 

哪将把这个档案中所有文件的组合内容传送到yourSoftware(在linux或cygwin下)。

E.g.计算字数总数使用以下命令:

tar -xf hugeFile.tar -O | wc -w 

假如你可能需要测试你的算法,它可能是明智的,以测试对一些规模较小的子集,也就是第一10.000线:

tar -xf hugeFile.tar -O | head -n10000 | yourSoftware 

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

+0

需要多少时间, – Vulcan

+0

我不知道,取决于很多因素。数据不会存储到磁盘,因此它可能会很快_。当然,这取决于你将处理数据的方式... – vlp

+0

'$ zcat Stage1_Articles.tgz/n gzip:Stage1_Articles.tgz:不是gzip格式“ 现在是什么? – Vulcan

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

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

下一次,你会得到一个巨大的存档,可以考虑要求它在afio存档格式,其中有个别压缩不太小文件的一大优势(或者问一些SQL转储 - 例如用于PostGreSQLSqliteMariaDB - 在压缩的表格)。

首先,你应该做的文件名列表在hugearchive.tgz gziped tar归档,并要求总字节数:

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

该命令将运行gunzip.tgz文件解压到一些管(所以不会消耗大量的磁盘空间)和表的,内容写入/tmp/hugearchive-list.txt,你会在你的标准错误得到

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

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

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

然后,您可以决定是否能够提取全部这些文件,因为您知道它们需要多少总大小。由于您拥有/tmp/hugearchive-list.txt中的目录,如果需要,您只能轻松提取有用的文件。


对于什么是值得的,我拥有16GB RAM和两个SSD &磁盘存储i3770K桌面上,我做了(用于实验)无用巨大的存档(专门为回答这个问题而作出的,因为我不

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

有你hugearchive.tgz文件 ....),并把这个时间来创建归档(与SSD所有这些文件系统):

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

和产生的/tmp/hugefile.tgz有5.4千兆字节(注意它可能位于page cache)。

我然后设法:

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归档文件不是GNU zip ped,请在tar命令中不要使用z命令。

阅读的tar(1)文件(并且还time(1)如果你使用它,以及更普遍的每个命令你使用!),当然使用命令行(而不是一些GUI界面),也learn一些shell脚本

顺便说一句,你可以稍后分离非常小的文件(小于64K字节)和例如将它们放在某个数据库(可能是一些SqliteRedisPostGreSQLMongoDB数据库,填充了一个小脚本)或者可能是一些GDBM索引文件。请注意,大多数文件系统对于大量小文件都有一定的开销。学习shell脚本和一些脚本语言(Python,Lua,Guile,Ocaml,Common Lisp)和基本数据库技术是而不是会损失时间。如果例如你开始一个博士学位,它几乎是一个需要技能组。我不知道也不会使用(也不喜欢)Windows,所以我显然有偏见(我的第一个Linux是一些Slackware,大约在1993年或1994年初的0.99.12内核),但我强烈建议你在Linux上完成所有的NLP工作(并保持Windows仅用于播放视频游戏,如果有时间的话),因为在Linux上脚本编写和组合许多有用的现有的free software是非常容易的。

+1

我特别喜欢段落顺便说一句:) – HuStmpHrrr

+0

'sudo time tar czf /tmp/hugefile.tgz/bin/usr/bin/usr/local/bin/var'我尽我所能,但无法确定这些额外路径指定了什么'/ bin/usr/bin/usr/local/bin/var' – Vulcan

+0

是的,我只有玩游戏的窗口..双启动与lubuntu的一切..和IAM不做博士。这是一个大学项目:P – Vulcan