場景描述:
現有許多行日志文本,按天壓縮成一個個TB級的gzip文件。
使用流對每個壓縮文件的數據段進行傳輸然后解壓,對解壓出的文本分詞并索引
以后查到這個詞時,定位到這個詞所在的文件和段,再用流傳輸并解壓
(實際上是想利用已有的壓縮文件構造一個類似ES的搜索引擎)
現在的問題是,因為接收到的不是完整的壓縮文件而是塊狀二進制數據,所以接收的數據由于信息不完全而無法解壓
現在想實現這樣的功能:首先將接收到的流數據解壓還原為完整的數據(原始日志數據以換行符分隔,能得到每段流數據壓縮前的文本和對應文件的偏移量就好),然后考慮到傳輸和存儲等過程可能使數據出錯,所以針對每段數據流,在出錯的情況下解壓出盡可能多的數據。
部分相關代碼如下:(改自https://stackoverflow.com/que...)
import zlib
import traceback
CHUNKSIZE=30
d = zlib.decompressobj(16 + zlib.MAX_WBITS)
f = open('test.py.gz','rb')
buffer = f.read(CHUNKSIZE)
i = 0
while buffer :
i += 1
try:
#skip two chunk
if i < 3 or i > 4:
outstr = d.decompress(buffer)
print('*'*10 + outstr + '#'*10)
except Exception, e:
print(traceback.print_exc())
finally:
buffer = f.read(CHUNKSIZE)
outstr = d.flush()
print(outstr)
f.close()
當i>=3以后,每次循環均報錯我的結論是 若流不連續(跳過接收部分數據),則之后的數據都無法解壓。問題1:如果做到能正確的解壓出收到的每部分數據?(因為可能牽涉到gzip壓縮的算法和數據結構,我正在看相關代碼。如果可以通過追加傳輸頭部的某一chuck或者需要解壓的數據的前后某些chuck能解決問題也算可以)問題2:如果不能正確的解壓接收到的每部分數據,那么如何做到解壓出盡可能多的數據?
對gzip文件進行流式解壓時,如何解壓出其中某些單獨的數據塊中的數據?
慕工程0101907
2019-03-01 10:58:37
