2016-06-22 54 views
0

我有一塊我想壓縮的數據塊,比如可變大小的C結構。我想壓縮數據,但在應用程序代碼中即時訪問結構的特定字段,而無需解壓縮整個數據。從原始數據的偏移中即時解壓縮數據?

是否有一個算法可以獲得偏移量(對於原始數據),解壓縮並返回數據?

回答

1

壓縮方法通常通過利用前面的數據來實現壓縮。在壓縮數據中的任何一點,您都需要知道至少一些前面未壓縮的數據,才能解壓後面的內容。

您可以故意忘記壓縮數據中選定點的歷史記錄,以便在這些點上進行隨機訪問。這會將壓縮量減少一定量,但對於距離足夠遠的隨機接入點來說,這可能會很小。一個簡單的方法是使用gzip壓縮碎片並連接gzip流,保留每個流的偏移記錄。爲了減少開銷,您可以在zlib中使用Z_FULL_FLUSH來做同樣的事情。

或者,您可以將每個隨機訪問點的歷史記錄保存在單獨的文件中。在zran.c中可以找到構建zlib或gzip流的隨機訪問索引的示例。

您可以構建不依賴於以前的解壓縮歷史的壓縮方法,如簡單的霍夫曼編碼。然而與依賴於以前的歷史的方法相比,壓縮比將會很差。

+0

謝謝。我還可以寫回壓縮數據嗎? –

+0

不是,不,因爲您無法預測壓縮數據的大小。 –

0

壓縮文件系統示例:我們有一個文件系統API,它不需要知道在寫入磁盤之前發生的壓縮。那裏有幾個算法。 查詢here瞭解更多詳情。

但是,試圖優化使用的數據結構可能會有更多的收益,因此不需要對它們進行壓縮? 爲了高效訪問,需要索引。因此,在數組和MultiMaps和Sparse Arrays之間,應該有一種方法來模擬數據,因爲數據可以高效地表示,所以不需要進一步壓縮。 當然,這在很大程度上取決於很模糊的用例。

需要一個壓縮層來訪問數據的用例可以想像,但很可能有更好的方法來解決這個問題。