2010-03-17 65 views
1

假設有〜10,000個密鑰,其中每個密鑰對應於一系列事件。我想支持以下操作:什麼是存儲映射「鍵 - >事件流」的最有效方式?

  • push(key, timestamp, event) - 推動事件的關鍵事件隊列,標有給定時間戳。確保特定鍵的事件時間戳按排序或幾乎排序順序推送。
  • tail(key, timestamp) - 獲得自給定時間戳以來的所有關鍵事件。通常,給定密鑰的時間戳請求幾乎是單調遞增的,幾乎與同一個密鑰的推送同步。

這個東西必須是持久的(雖然它不是絕對必須立即堅持推動並保持拖尾嚴格同步),所以我打算使用某種數據庫。

此任務的最佳數據庫結構類型是什麼?使用關係數據庫,鍵值存儲還是其他的更好?

回答

2

對硬件有任何說法可以使用嗎? 假設這將有更多的讀取比寫入,這可能是SSD的理想應用程序,加上TomTom提到的 - 將事件作爲文件存儲在專用目錄中。

如果你這樣做,我建議有一個目錄爲每個「關鍵」,並組織他們在子目錄。

也就是說,假設你有一個這樣的關鍵:HJ029084930A

你應該有:

/streams 
/streams/HJ02 
/streams/HJ02/9084 
/streams/HJ02/9084/930A/HJ029084930A 
/streams/HJ02/9084/930A/HJ029084930A/20100315/230257.trc 
/streams/HJ02/9084/930A/HJ029084930A/20100316/000201.trc 
/streams/HJ02/9084/930A/HJ029084930A/20100316/000203.trc 
/streams/HJ02/9084/930A/HJ029084930A/20100316/010054.trc 
... 
/streams/HJ02/9084/930A/HJ029084930A/20100317/010230.trc 

我所暗示的是,你應該盡最大努力避免「太多」的文件(或目錄),或者操作系統可能會減慢檢索你的東西。

一個可能的問題是當一個流從一天結束到下一個結束時重疊。 看看你是否可以拆分它,以便你可以在23:59:59完成,並從第二天的00:00:00開始創建一個新的。這取決於你的情況下「tail()」的語義。

2

使用財務數據? ;)我在這裏有一個應用程序,在測試中提供了150萬個這樣的流(CME complete feed);)

關係 - 你可以做到,但它是浪費。我所做的是PER STREAM的二進制存儲,並將這些線索變成二進制高效的三角洲格式(時間戳總是上升 - 因此不需要保持它們總數,只有阿爾卑斯小小的ldelta)。我將它們存儲在15分鐘的片段中,並且檢索尾部的系統知道如何獲取數據。在關係方面也減少了很多負擔。

Ther eare爲此專門的數據庫,但它們是淫穢的(每個處理器核心10.000美元,最低許可證8核心 - 是的,正確)。

某些應用程序會使用平面文件(每個鍵一個),即使是非風格應用程序。我個人不喜歡這個。

+0

謝謝,這看起來類似於我自己的想法,但我仍然對其他解決方案感興趣:)(順便說一句,它不*關於財務數據) – jkff 2010-03-17 09:25:06

相關問題