我有一个tar存档(17GB),它包含许多小文件(所有文件都<1MB)。 我如何使用此存档。
它实际上是一个处理过的维基百科数据集,我应该在其上执行一些自然语言处理。
平台Windows / Linux不是问题;只要能尽快完成工作,任何事都可以。
答案 0 :(得分:4)
我想你有一台Linux笔记本电脑或台式机,你的hugearchive.tgz
文件放在某个本地磁盘上(不是远程网络文件系统,这可能太慢了)。如果可能,将hugearchive.tgz
文件放在某个快速磁盘(最好是SSD,而不是磁性旋转硬盘)和快速Linux本机文件系统(Ext4,XFS,BTRFS,而不是FAT32或NTFS)上。
请注意,.tgz
文件是.tar
文件的gnu压缩压缩文件。
下次获得一个庞大的存档时,请考虑以afio存档格式询问它,这样可以单独压缩不太小的文件(或者可能要求一些SQL转储 - 例如{{} 3}}或PostGreSQL或Sqlite - 压缩形式。)
首先,您应该在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字节),例如将它们放在一些数据库中(可能是一些learn或Sqlite或Redis或PostGreSQL数据库,例如一个小脚本)或者某些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
如果您的处理软件需要将文件放在磁盘上,那么您需要提取此存档(请注意,某些文件系统不能很好地处理许多小文件 - 它可能会消耗更多的可用空间然后访问时间可能也很长。)