我有以下結構日誌文件:解析gzip壓縮日誌文件一行行內焦油gzip壓縮文件
/var/log/2013-12-24.tar.gz
這個文件有:
2013年12月24日/ {00,01,02 ...... 23} .log.gz文件
我需要分析這些文件,使用Python,
,而不在磁盤上提取任何文件OR內存
有什麼建議嗎?
我有以下結構日誌文件:解析gzip壓縮日誌文件一行行內焦油gzip壓縮文件
/var/log/2013-12-24.tar.gz
這個文件有:
2013年12月24日/ {00,01,02 ...... 23} .log.gz文件
我需要分析這些文件,使用Python,
,而不在磁盤上提取任何文件OR內存
有什麼建議嗎?
這不可能與.tar.gz
,這就是爲什麼。
爲了創建.tar.gz
文件,你必須要tar
它首先創建單個文件.tar
,然後gzip
的結果。
.tar
文件可以在不讀取整個文件的情況下對其進行掃描,但只有當tar
存檔的成員相對較大時才能正常運行。這是因爲tar
沒有任何標題,其中列出了所有成員在一個緊湊的地方。每個檔案成員都有512字節的描述符,比顯示下一個描述符的位置。使用大檔案成員,您可以在磁盤上相對快速地找到任意成員內容,但您必須多次訪問lseek()
。
但是,一旦您在.tar
之上應用gzip
,基本上無法快速獲取存檔的所有成員的列表,更不用說實際獲得其內容的未壓縮。你不得不解壓縮整個檔案,甚至只是獲得其所有成員的名單。
請注意,流行的.tar.bz2
或.tar.xz
格式存在完全相同的問題。
您可以使用zip
格式來修復它。 zip
與.tar.gz
相比具有很大優勢,因爲它具有可在一個位置列出所有存檔成員的緊湊索引,並且它允許快速讀取該列表並僅提取所需的文件,而無需提取(gunzip).tar.gz
所遭受的整個存檔。
好了,所以可以使用一些bash的福,有些子魔我本事? –
你仍然需要足夠大的空間來保存原始'.tar.gz'的未壓縮內容。如果你有很多的內存,並且這個檔案不是很大(未壓縮),它可以*存儲在'/ tmp'中作爲'tmpfs'掛載(在內存中有效!) – mvp
我找到了解決方案。我只是給它在這裏以供參考:
import subprocess
file_name = /var/log/2013-06-10.tar.gz
gzip_data = subprocess.Popen(["tar", "-Oxf", file_name], stdout=subprocess.PIPE)
data = subprocess.Popen(["zcat"], stdin=gzip_data.stdout, stdout=subprocess.PIPE)
for line in data.stdout:
do_my_process_on(line)
無需解壓,我的建議是找一個嚮導:) – pypat