2015-09-27 121 views
2

我有一個tar歸檔文件(17GB),它由許多小文件組成(所有文件< 1MB)。 如何使用此存檔。如何加速提取大量小文件的tgz文件?

  1. 我會提取它嗎?在我的筆記本電腦上使用7-zip表示需要20小時(我認爲這需要更多時間)
  2. 我可以在不提取文件的情況下讀取/瀏覽文件的內容嗎?如果是,那麼如何?
  3. 有沒有其他的選擇?

它實際上是一個處理過的維基百科數據集,我應該在其上執行一些自然語言處理。

平臺Windows/Linux不是問題;只要能夠儘快完成工作,任何事情都可以做到。

+0

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

+0

帶有許多文本文件的'.tgz' – Vulcan

+0

那裏有多少個文件?這聽起來很奇怪,這樣一個小文件需要很多時間...... –

回答

1

很難回答不知道這些數據應該如何處理。

如果你的「自然語言處理」軟件可以從管道(流)處理輸入 - 那麼你可以處理歸檔的內容,而無需使用以下的任何變體提取它:

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

3

我想你有一臺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

相關問題