2010-05-07 50 views
5

我在共享服務器上使用有限的磁盤空間,我有一個gz文件,超級擴展到一個巨大的文件,比我有更多。我怎樣才能提取它「部分」的「部分」(可以說一次10MB),並且處理每個部分,而不用提取整個東西,甚至是暫時的!GUNZIP/Extract file「逐個部分」

不,這只是一個超級巨大的壓縮文件,不是一組文件,請的......


嗨大衛,你的解決方案看起來很優雅,但是如果我準備好它的權利,這似乎是每一個gunzip解從文件的開頭提取時間(和輸出)我確信這會對我所在的共享服務器造成巨大的壓力(我不認爲它的「讀取前進」) - 你對我如何能做出任何見解gunzip「跳過」必要的塊數?

+0

我不相信這是可能使壓縮程序 「跳到」 這樣的。 gzip規範(http://www.gzip.org/zlib/rfc-gzip.html#file-format)表示格式「不會嘗試......提供對壓縮數據的隨機訪問」。 – 2010-05-07 12:34:15

回答

11

如果你使用(UNIX/Linux)的外殼工具這樣,您就可以使用gunzip -c解壓縮到標準輸出,然後使用ddskipcount選項只複製一個塊。

例如:

gunzip -c input.gz | dd bs=10485760 skip=0 count=1 >output 

然後跳到= 1,跳過= 2等

+0

傑出的洞察力大衛 - 它不完全是我尋找的東西,但我會接受它...... – Dave 2010-05-16 07:22:36

1

不幸的是,我不知道現有的Unix命令完全符合你的需求。您可以使用任何語言的小程序輕鬆完成此操作,例如在Python,cutter.py(任何語言會做一樣好,當然):

import sys 
try: 
    size = int(sys.argv[1]) 
    N = int(sys.argv[2]) 
except (IndexError, ValueError): 
    print>>sys.stderr, "Use: %s size N" % sys.argv[0] 
    sys.exit(2) 
sys.stdin.seek((N-1) * size) 
sys.stdout.write(sys.stdin.read(size)) 

現在gunzip <huge.gz | python cutter.py 1000000 5 > fifthone會把文件fifthone整整百萬字節,跳過未壓縮的流中的前4個百萬字節。