2014-06-10 60 views
3

我們有一些大型數據文件正在連接,壓縮併發送到另一臺服務器。壓縮減少了到目標服務器的傳輸時間,所以我們可以在短時間內獲得文件越小越好。這是一個高度時間敏感的過程。對文件進行排序以優化壓縮效率

數據文件包含許多行製表符分隔的文本,並且行的順序無關緊要。

我們注意到,當我們通過第一個字段對文件進行排序時,壓縮文件的大小要小得多,這可能是因爲該列的重複項彼此相鄰。但是,對大文件進行排序很慢,並且沒有真正的理由需要排序,而不是改善壓縮。第一列和後續列中的內容也沒有關係。可能會有一些壓縮更小的行的順序,或者可能有一種算法可以類似地提高壓縮性能,但需要更少的時間來運行。

我可以使用什麼方法重新排列行以優化相鄰行之間的相似性並提高壓縮性能?

+2

您可能只需要更大的字典大小。如果使用文件來提高壓縮率,似乎表明字典太短,以致到下一個相同的值出現時,壓縮算法已經忘記了以前的值。大多數壓縮算法允許您更改用於記住這些值的字典的大小。 – HugoRune

+1

以前發佈爲答案,但實際上過於寬泛:您可以嘗試[clustering](https://en.wikipedia.org/wiki/Cluster_analysis)數據,然後按羣集進行分組。與壓縮本身一樣,聚類是通常由啓發式處理的難題。 –

+1

你使用什麼壓縮算法? – Gumbo

回答

1

這裏有幾個建議:

  1. 分割文件爲較小的批次和排序的。排序多個小數據集比排序單個大數據塊要快。您也可以通過這種方式輕鬆地平行工作。
  2. 用不同的壓縮算法進行實驗。不同的算法有不同的吞吐量和比率。您對這兩個維度的pareto邊界上的算法感興趣。
  3. 使用更大的詞典大小。這允許壓縮機參考過去的數據。

請注意,無論您選擇哪種算法和字典大小,排序都很重要,因爲對舊數據的引用傾向於使用更多位。此外,按時間維度排序趨向於將來自相似數據分佈的行組合在一起。例如,Stack Overflow在夜間比在白天擁有更多的bot流量。在他們的HTTP日誌中,UserAgent字段值分佈可能隨着時間的不同而大不相同。

+0

將文件拆分成可以在內存中排序並對其進行排序的塊可能會有所不同,但排序方式比排序整個連接文件效率更高,並且獲得幾乎相同的壓縮效率。謝謝! –

0

如果列包含不同類型的數據,例如

Name, Favourite drink, Favourite language, Favourite algorithm 

,那麼你可能會發現,調換數據(如改變行到列)將提高壓縮率,因爲每個新項目的zip算法只需要編碼哪個項目是最喜歡的,而不是這兩個項目和類別。另一方面,如果一個單詞在任何列中出現的可能性相同,那麼這種方法不太可能有任何用處。

0

Just in:只需嘗試使用不同的壓縮格式。我們發現,對於我們的應用程序(壓縮SQLite數據庫),LZMA/7z壓縮比zip壓縮約4倍。只是說,在你執行任何事情之前。