我有一個非常大的文件壓縮與坐在磁盤上的gzip。生產環境是基於「雲」的,因此存儲性能很差,但CPU很好。以前我們的數據處理流程開始於gzip -dc
從磁盤流式傳輸數據。隨機訪問gzip文件?
現在,爲了平行工作,我想要運行多個管道,每個管道都需要一對字節偏移量 - 開始和結束 - 並獲取該文件的大塊。用一個普通的文件,這可以通過head
和tail
來實現,但是我不知道如何用壓縮文件有效地完成它;如果我gzip -dc
和管道head
,接近文件末尾的偏移對將緩慢地解壓縮,浪費地搜索整個文件。
所以我的問題是關於gzip算法 - 理論上可能尋求在底層文件中的字節偏移量或獲取它的任意塊,而沒有解壓到整個文件的全部影響到那一點?如果不是,我怎麼可以有效地對一個文件進行分區以便多個進程進行「隨機」訪問,同時最大限度地減少I/O吞吐量開銷?
您首先需要依次讀取bzip2文件以查找塊。然後你可以單獨訪問它們。 gzip格式也可以做到這一點。 –
我不認爲你提到的是隨機訪問壓縮文件的最佳方式,請參閱本文:http://blastedbio.blogspot.com/2011/11/bgzf-blocked-bigger-better-gzip.html和Hadoop中的這個問題跟蹤器:https://issues.apache.org/jira/browse/HADOOP-4012 –
正如我在我的回答中所說的,您可以準備一個gzip文件以優化隨機訪問。隨機訪問的一些應用程序控制gzip文件的創建,在這種情況下,您將爲此目的準備gzip文件並同時構建索引。有些應用程序不能控制gzip文件的創建,在這種情況下,您需要解壓縮一次才能創建索引。 –