2013-06-27 45 views
1

我有分隔的日誌文件,每隔5分鐘捕獲一些進程的快照。我想對它們進行一些統計分析,對數據的子集進行分組和繪製圖表等,其中一部分涉及計算過程開放的時間(即總分鐘數= x 5中出現的快照數量)。我可以使用Python,R或我選擇的任何語言。推薦快照數據的數據結構

所面臨的挑戰是,田沒有是唯一的(有一個一對多和多對多的一對多關係),所以唯一的比賽是在對整個線上的每要素是相同。

也許一個例子會有所幫助。比方說,第一個快照日誌看起來是這樣的:

R123,M,5,... <-- line A 
R190,Z,4,... 
R663,M,8,... 

然後5分鐘後,下一個快照顯示了這個:

R123,M,5,... <-- line A 
R123,P,3,... <-- line B 
R955,Z,3,... 

顯然的過程中A線已經出現了至少5分鐘現在。但即使B行具有相同的第一個字段,但其他字段不匹配,因此它不是相同的過程。

我只是想弄清楚一個很好的數據模型,使這個數據很容易處理。

一個選項可能是一個簡單的頻率計數:將每行整行讀入一個Python字典或Perl散列,並將該行作爲關鍵字,這樣當下一個快照中出現重複行時,它就會添加到計數中。例如在Perl中:$count{$_}++ foreach @lines;

但是,整行數據甚至可以作爲字典鍵有效嗎?那麼非連續的實例怎麼樣,比如如果A行出現3個快照,那麼另一天又會出現? - 這些實例應該是單獨的實例,以便基於時間的查詢仍然有效。

對我有何建議我可能會處理&存儲這些數據?

+2

爲什麼不拔出重複的行?有一個具有數據幀方法的「重複」函數。 –

+0

@DWin:因爲我需要量化他重複的行數,因爲關於這個過程持續了多長時間的關鍵數據只能通過查看從第一次出現到最後出現多少次或多長時間才能找到。 – ewall

回答

1

第一個問題 - 當然,至少在Perl中,您可以使用任何字符串作爲散列鍵。無限。

Next:按順序評估快照。在快照1處,只需將所有內容讀入內存,併爲每個項目分配一個計數器0。繼續快照2.在快照N處,按以下步驟操作:將任何新內容存儲在內存中,並指定計數爲0.任何已存儲在內存中的內容都將使用增加的計數器保存在內存中。內存中的任何內容,但不在當前快照中的內容都會歸檔到輸出文件中。

如果您擔心日誌文件的大小,而不是Perl的散列使用SQL數據庫,例如通過DBI的SQLite。

+0

嗯...按順序讀取可以讓我爲每個進程創建自己的唯一標識,用非連續的實例解決問題,並使其適合關係數據庫。絕對是一個很好的可能性。 – ewall