2011-04-20 75 views
1

我需要在客戶端服務器應用程序中記錄和過濾機制。其中客戶端可以根據某個參數請求日誌數據。選擇合適的STL容器進行日誌記錄數據

日誌將具有MACID,日期和時間,命令類型和方向字段。

服務器也可以根據這些參數過濾日誌數據。 日誌的大小是10 MB之後,日誌將從開始覆蓋消息。

我的做法是,我將「內存」,在日誌數據中的STL容器爲到文件以及這樣,當客戶端請求數據服務器將篩選基於任何標準

日誌數據,所以過程是服務器將首先對矢量<>上的特定條件進行排序,然後使用二分搜索對其進行過濾。

我打算在內存中記錄數據用向量作爲STL容器。

我有點糊塗了矢量是否會在適當這種情況下,還是不行。

因爲可以最大的數據的大小高達在矢量10 MB。 我的問題矢量是否足夠適合這種情況?

+0

我還不清楚,如果你已經在文件上記錄,那麼爲什麼你還需要登錄到'矢量'?你的代碼是否需要讀'vector'? – iammilind 2011-04-20 06:56:34

+0

我需要將日誌信息存儲在向量中,以便在用戶根據上述參數請求日誌數據時對其進行過濾。客戶端服務器程序將記錄服務器日誌數據和客戶端請求的日誌數據。 – 2011-04-20 08:38:54

回答

1

我想去一個雙排隊,雙端隊列。它就像一個矢量,但你可以從兩端添加/刪除元素。

+0

爲什麼你想在這種情況下開始添加/刪除元素? – Gorpik 2011-04-20 07:41:08

+0

元素需要被移除,一旦10mb大小達到。如果達到限制,最新添加的消息將被刪除。 – 2011-04-20 08:36:35

+0

事件在一端添加並在另一端刪除。 你可以用一個向量和一個指針來完成同樣的事情,這個指針告訴你在哪裏覆蓋舊的事件,但是這個deque只是爲你做的。 – Adam 2011-04-20 08:37:39

1

我會,因爲有許多和我向你保證,他們會做(對前log4cxx)一份更好的工作,我會使用一個日誌庫第一狀態。如果你堅持這樣做你自己一個向量是一個合適的機制,但你將不得不手動排序偏見的用戶請求的數據。另一個想法是使用sqllite並讓它管理存儲排序和篩選數據。

+0

你的意思是log4cxx? log4cpp庫似乎在2007年停止開發。 – vividos 2011-04-20 07:09:40

+0

是的。我記不起實際的名字,但log4cxx是apache項目。 – rerun 2011-04-20 07:21:12

+0

我正在使用log4cxx,但僅用於記錄file.does log4cxx支持篩選的信息。 – 2011-04-20 08:35:11

0

實際響應將取決於使用模式和接口。如果您正在使用圖形用戶界面,那麼很可能已經有一個小部件在某種程度上實現了該功能(可以按不同列排序,甚至過濾)。如果你真的想在UI之外實現它,那麼它將取決於使用模式,用戶是否希望特定的視圖比其他視圖更多?她只需要過濾,還是需要排序?

如果有在大多數情況下要使用的數據的一個視圖,您只需要顯示不同的順序幾次,我會繼續元素的std::vectorstd::deque,並與remove_copy_if時過濾掉需要。如果需要不同的排序,我會複製並對副本進行排序,以避免不得不重新排序回到基於日誌的時間點。請注意,如果您的應用程序不斷推送您需要更新副本的新數據(或提供固定視圖並定期重新運行該操作)的數據。

如果發生更經常比其他人,如果你不想去通過實施上述的疼痛沒有特別的看法,看看升壓多指數容器。他們使用不同的標準保持同一數據的同步視圖。在最後一種情況下,這可能是最有效率的,即使它在統治觀點的一般情況下可能效率較低,它可能使事情變得更簡單,因此它仍然值得。

相關問題