2013-05-05 44 views
1

想象一下,你必須問世界上每個人有關他們從1到10的規模的幸福。每個人都回應。有多達80億人,所以你必須使用bigint作爲關鍵字(讓我們假設我們已經擁有另一個數據庫中的身份,而且我們只需要密鑰),而且你實際上擁有近80億條獨特的記錄。然後,對於每個記錄,您必須存儲從1到10的值 - 在大多數將映射到字節數據類型的DB中(這只是一個假設,我們也可以從0到255的等級來衡量幸福)。如何壓縮所有世界人口簡單民意測驗

80億人*(8字節鍵+ 1個字節值)= 64個千兆鍵值+ 8千兆值= 72 GB的總大小。

是否有可能大大減少存儲大小爲相同的任務中任何主流數據庫,例如SQL Server或MySql?

我不打算做這樣的調查,也沒有那麼多的用戶,大關鍵是其他幾個int鍵的笛卡爾積的結果,從長遠來看,我可以用簡單的數十億條記錄每個小ID的組合的數值。

+0

如果你只是想保存結果,你可以根據他們的選擇來計算人數。那麼你將有一個10行的表。 – TheHippo 2013-05-05 19:54:13

+0

@TheHippo我需要保存每個密鑰。否則,這將是微不足道的 – 2013-05-05 19:55:26

+0

就信息理論而言,並假設密鑰不包含無法從記錄序列中的位置派生的信息(因爲它通常是整數主鍵的情況),此數據包含8 * 10^9 * log_2 10位信息。根據谷歌,這是26575424759.1,這是一個小於3.1 GiB。所以你的編碼是非常低效的。我還假設沒有什麼關於壓縮程序可以利用的數據來使它更小 - 沒有模式,均勻分佈等。 – delnan 2013-05-05 20:20:43

回答

1

你不需要存儲關鍵是能夠使用密鑰。你只需要一個包含響應的數組。所以80億人給出了80億字節。這就是8 GB。

如果你只是想,說16分可能的答案,您可以在一個字節的包兩個答案,你是下降到4 GB。

如果你真的希望這是小&快速的平面文件可能只是如果沒有更好的爲好。這取決於您的使用類型。

但是,如果你真的想在一個表中,但仍保持它的小,你需要擺脫對每個記錄的關鍵。這就是你可以通過像共享記錄之間的關鍵做到這一點:

Key  n0 n1 n2 n3 n4 n5 n6 n7 n8 n9 
00000000 7 1 2 13 7 8 9 11 2 9 
00000010 3 7 8 9 11 2 6 7 9 12 

這裏回答00000000-00000009都擠滿記錄00000000和答案00000010-00000019都擠滿紀錄00000010

+0

,但我應該如何將它存儲在數據庫能夠在合理的時間內訪問任何密鑰? – 2013-05-05 20:03:55

+0

@ V.B。如果您的數據庫不允許進行此優化,請棄用您的數據庫並將其存儲(否則(例如,在BLOB或外部文件中))。沒有太多你需要的DB,你可以優化很多,等等。 – delnan 2013-05-05 20:25:48

+0

所以這給出了每行14個字節和800萬行,或者11個GB而不是72個。非常好!如果世界上有43億人呢? – 2013-05-06 09:18:52

0

如果按鍵分佈較爲稀疏,你堅持有明確地將響應與密鑰配對。您可以通過將此輪詢存儲在已有鍵列的另一個表中進行保存,從而節省工作量。

如果按鍵連續,Ebbe的方法將效果最佳。如果您必須使用表結構,則可以將這些數據分成1024個分片,並在進行密鑰查找時使表中的密鑰包含密鑰的前10位。

您還可以從密鑰的尾部保存一些存儲。例如,我們不想存儲密鑰的最後10位。然後將密鑰截斷10位並在那裏存儲一個blob,這將是一個1024個響應的平面陣列。

您可以通過爲每個答案10個表和鑰匙插入到每個取決於調查的答案(這不會結合上面有些東西的工作保存民意調查數據(1個字節值),再加上它不會如果您的投票回答範圍很大,則進行縮放)。