2012-03-27 100 views
0

我正在處理項目的一部分,它解析Postgres數據庫服務器中的日誌。 該應用程序是在C sharp Framework 4.0中開發的。從Datagridview行生成統計信息

日誌產生和上一個DataGridView顯示有以下的列

resultCode  Statement     Starttime     Duration 
XT001   select * from PizzaMade 01-02-2012 03:10:14   00:04:10 
  • 有許多loglines與sameformat。
  • 通過解析文本文件從另一個循環填充Datagridview。

我的工作是生成數據可用的統計信息網格的格式如下

Statement         Count  countpercent     Occurs_on 

select * from PizzaMade      3    1.42  01/02 at 03pm [00:04:10], 01/02 at 04 [00:01:04] 
select id,qty,table from PizzaMade   12    5.12   ........... 

所以基本的統計數據反映了以下

  • 一)語句執行
  • b )計數出現在網格中的次數
  • c)計數的百分比,其基本上是totalcounts此語句佔據
  • d)含有開始時間級聯串,持續時間

»該統計信息是作爲數據表最初產生,使用for循環

foreach(DataGridViewRow dr in LogGrid.Rows) 
{ 
// search in the Datatable if the statement is present 
// if it is then add count , add starttime and duration to the column 
// if not then add a newrow 

} 

»填充DataTable之後,我用一個循環來計算Totalcount

int totalcount = 0; 
foreach (DataRow drin StatTable.Rows) 
{ 
totalcount = totalcount + Convert.ToInt32(dr["count"].ToString()); 
} 

»計算計後,有一個循環計算百分比

foreach (DataRow dr in StatTable.Rows) 
{ 
    int c = Convert.ToInt32(dr["count"].ToString()); 
    dr["countpercent"] = (c/totalcount)*100; 
} 

雖然一切看起來正常,整個方法是緩慢的具有大量的行。

  • 請問您能否提出改進性能的方法。

感謝 阿文德

+1

你可以嘗試爲獲得總數使用DataTable的計算方法,但我不知道是否會提高性能 – mslliviu 2012-03-27 05:58:38

+0

我測試的計算方法上的100萬所記錄的樣本數據,似乎foreach循環需要545ms並計算方法1850毫秒。即foreach循環更快 – arvind 2012-03-27 06:26:10

回答

1

既然你解析文本日誌,它可能通過不格但在對象操作的增強性能。此外,網格可以綁定到解析日誌列表。它可能是這樣的:

public class LogItem 
{ 
    public string ResultCode { get;set;} 
    public string Statement { get;set;} 
    public DateTime StartTime { get;set;} 
    public TimeSpan Duration { get;set;} 
} 

然後你的網格可以綁定到包含所有解析日誌項目的BindingList。雖然有列表,你可以在更統一的方式訪問數據:

foreach (string statement in logItems.Select(x => x.Statement).Distinct()) 
{ 
    int count = logItems.Count(x => x.Statement == statement); 
    double percentage = count/logItems.Count(); 
    // any additional data 
} 

如果你想成爲額外的高性能和花哨,你可以分析所有日誌文件保存到數據庫,並創建必要的數據查詢。

+0

我會轉發此技巧,但截至目前,我只能訪問datagridview中存在的內容。另一種方法是從文本文件更新Datagridview。該代碼在我的桌面上不可用。因此這個例子不會顯示它。 – arvind 2012-03-27 06:22:06

+0

我可以使用這個類,並從Datagridview行生成列表,這有幫助嗎?因爲與行之後的速度相關的問題被填充。 – arvind 2012-03-27 06:23:16

+0

你總是可以將網格中的數據解析爲類似人類的形式,並保留它:) – 2012-03-27 06:23:36

1

我有一些建議,

你可以使用LINQ使用這樣你的循環過程。基本上linq使用了優化的查詢,並且性能很好。

DataTable obj = new DataTable(); 
     obj.Columns.Add("count",typeof(Int32)); 
     DataRow dr = obj.NewRow(); 
     dr[0] = "10"; 
     obj.Rows.Add(dr); 

     DataRow dr1 = obj.NewRow(); 
     dr1[0] = "5"; 
     obj.Rows.Add(dr1); 

     obj.Columns.Add("countpercentage"); 

     int intCount = (from DataRow drrow in obj.Rows 
         select drrow.Field<int>("count")).Sum(); 

     (from DataRow drtemp in obj.Rows 
     select drtemp).ToList<DataRow>() 
     .ForEach(x => x.SetField<string>("countpercentage", ((x.Field<Int32>("count")*100)/intCount).ToString())); 
+0

爲什麼我們在這裏計算平均值..(抱歉,但是我對linq的曝光是有限的,) – arvind 2012-03-27 07:05:27

+0

該領域是爲了百分之幾。現在更新。 – 2012-03-27 07:39:53

+0

它在兩個地方的'from'關鍵字上生成錯誤,>>'System.Data.DataRowCollection'不包含'Cast'的定義 – arvind 2012-03-27 07:54:36