2011-02-05 85 views
0

我們有一個消息系統,其中一個模塊以高速率向另一個遠程模塊發送一些消息。接收模塊以特定格式對此消息進行解碼並將其轉發給兩個線程。一個稱爲記錄器線程,另一個稱爲轉發器線程。使用什麼數據結構

在我們發送此消息給這些線程之前,我們需要對這些消息進行一些分組。

請注意,這些消息的速度很快,大約每秒800次。

警報結構如下:

  1. INT型
  2. INT發送系統ID
  3. INT器Recpt系統ID
  4. INT時間戳
  5. INT碼
  6. INT源端口
  7. INT目標港口
  8. 源IP地址(IPv4或IPv6)
  9. 目標IP地址(IPv4或IPv6)

在我們需要保持的結構並具有以下細節的比賽結束

struct{ 
    INT COUNT 
    INT First Alert Timestamp 
    INT Last Alert Timestamp 
    INT First Alert ID 
    INT Last Alert ID 
} 

對於符合8個標準的每個警報,將創建/挑選一個組,並將計數與其他詳細信息一起遞增。

IP地址字段可以是5個字段(INT地址類型,INT地址1,INT地址2,INT地址3和INT地址4)的結構,也可以轉換爲字符串並存儲在結構中。

我們一直在ra our我們的頭,但無法找到足夠有效的結構或算法,以便可以解決內存和速度問題。

因此想到了專家尋求幫助。

+0

結束什麼匹配?什麼標準? – btilly 2011-02-05 05:21:04

回答

0

一個雙鏈表來存儲匹配的警報。使檢索第一個和最後一個AlertID變得容易。您可能需要擴展雙鏈表以擁有一個計數字段。

根據您的性能要求,您可以將列表中的警報與標識符進行散列組合。如果這還不夠快,可以實現一個更復雜的樹形結構,這些樹形結構按照識別字段進行分組。

我可以建議的最好的事情是讓它以最簡單的方式工作,每秒800毫秒是沒有的。如果您遇到性能問題,請優化。使用測試驅動開發寫這樣的東西非常有趣,擊敗了你的平均粗糙代碼!

0

你打算怎麼寫?任何建議都將嚴重依賴於該語言。

最好的做法是從Dictionary<string, ContainerObject>開始,其中的關鍵字包含所需的參數,以便進行快速查找。繼續在內存中處理此字典,同時讓另一個進程正確記錄值以表示數據庫或平面文件。

保持簡單,800秒不應該是一個問題。然而,交流手段將成爲一個主要因素。這是本地還是遠程?如果它是遠程的並且來自單一來源,那麼如果它是在單個請求中完成的話,那麼您的剋星將會延遲建立。