2009-05-18 54 views
8

我要壓縮位置數據(緯度,經度,日期,時間)。所有的數字都是固定的格式。其中2個(經度,緯度)採用十進制格式。其他2是整數。僅限數字的壓縮算法

現在這些數字是固定格式的字符串。

什麼是固定格式壓縮數字的算法? 數字只有壓縮(如果有的話)比字符串壓縮更好嗎? 我應該直接壓縮字符串而不將其轉換爲數字,然後壓縮?

在此先感謝。

+1

你是否使用lat/long的固定點或浮點數?如果你有固定數量的職位,你可以將這些值字節打包成一個字節數組。由於每個數據包中的數據量非常小,因此壓縮/數據包頭中的數據可能會超過數據本身。你還使用哪種語言? – 2009-05-18 18:23:52

回答

7

這是一個小理論有用的地方之一。你需要考慮幾件事:

  • 什麼是你的測量分辨率:0.1°或0.001°? 1秒或1微秒?
  • 是相關的測量,並以某種順序,或隨機拋出?

比方說,例如,分辨率是0.01°。他們知道你的值範圍從-180°到+ 180°,或35900個不同的值。 Lg(35900)≈ 16所以你需要16位; 14位爲-90° - + 90°。顯然,如果您將這種類型的值存儲爲浮點數,則可以立即將數據壓縮一半。

與日期時間類似,範圍是多少;你有多少位?現在

,如果數據以某種順序(比如,按順序取一艘單船樣),那麼你需要的是一個起始值和增量;那可以做出的區別。隨着一艘船以30節的速度行駛,位置不能再改變,即每小時0.03度或每秒0.0000083度。那些三角洲將會是非常小的值,所以你可以將它們存儲在很少的位上。

的一點是,有很多事情可以做,但你要知道更多有關數據比我們作出建議。


更新:哦,等等,定點?!

好的,這是(相對)容易。剛開始,是的,你想要將你的字符串轉換成二進制表示。只是使了一個數據項,你可能有

040.00105.0020090518212100Z 

,你都可以轉換成

 
| 4000   | short int, 16 bits | 
| 10500   | short int, 16 bits | 
| 20090518212100Z | 64 bits   | 

所以這是96位,12個字節與26個字節。

+0

感謝您的出色建議。我期待着那樣的解決方案。 這裏,數據格式是固定的,並且有成千上萬的連續數據。所以,我想這裏的增量解決方案更有效率。問題是,它沒有索引。所以,數據在讀取之前總是需要解壓縮。 你可以建議一個更好的索引解決方案嗎? 非常感謝。 – fireball003 2009-05-19 00:56:47

5

壓縮通常適用於字節流。當流的字節值分佈不均勻時(例如文本或以文本形式存儲的數字),您可以實現的壓縮比將會更高,因爲較少的位用於存儲更頻繁出現的字節(在Huffman壓縮)。

通常,您所談論的數據將被簡單地存儲爲二進制數字(不是文本),這通常是空間和檢索效率。

我建議你看看The Data Compression Book

2

你壓縮什麼樣的數據?它是如何分發的?它是以任何方式訂購的?所有這些都會影響它的壓縮程度,也許可以讓你將數據轉換成更容易壓縮的東西,或者簡單地把它們放在大門外面。

數據壓縮在「隨機」數據上效果不佳。如果你的數據在一個較小的範圍內,你可能會充分利用它。

事實上,你應該簡單地嘗試運行任何常見的算法,看看數據是否足夠「壓縮」。如果不是,並且您對數據的瞭解比可以通過壓縮算法「直覺化」的更多,則應該利用這些信息。

一個例子是說你的數據不僅僅是Lat和Long的數據,但是它們被假定爲彼此「接近」。那麼你大概可以存儲一個「原點」Lat和Long,其餘的可以是差分的。也許這些差異足夠小以適應單個有符號字節。

這只是一個簡單的事例,你可以用數據知識來比較一些通用算法可能無法解決的問題。

1

這取決於你將要對數據做什麼,以及你需要多少精度。緯度/長度傳統上以度,分和秒的形式給出,其中60秒到分鐘,60分鐘到1度和1度緯度,標稱等於60海里(nmi)。 1分鐘時則1 NMI,1秒是剛剛超過100英尺

緯度從-90到+90度推移。將緯度表示爲整數秒會給出-324000 .. + 324000或約20位的範圍。經度從-180到+180,因此用相同的方式表示經度需要1個位。

因此可以表示一個完整的緯度/經度位置,至+/-50英尺,在41位。

顯然,如果你並不需要那麼多的精度,可以背下來的比特數。

觀察到,傳統的單精度32位浮點使用大約24比特位尾數,所以你是下降到約+/- 6如果支腳你只是轉換你的緯度/長在幾秒鐘內浮動。對於這種事情來說,擊敗兩個單精度浮標是很難的。