Генерация статистики из строк Datagridview - PullRequest
0 голосов
/ 27 марта 2012

Я работаю над разделом проекта, который анализирует журналы с сервера баз данных Postgres.Приложение разработано на C sharp Framework 4.0.

Журнал создается и отображается в DataGridView со следующими столбцами:

resultCode       Statement                  Starttime                   Duration
XT001         select * from PizzaMade    01-02-2012 03:10:14         00:04:10
  • Есть много строк журнала с одинаковым форматом.
  • Datagridview заполняется из другого цикла путем анализа текстового файла.

Моя работа заключается в создании статистики из данных, доступных в Grid, в следующем формате

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           ...........

таким образом, в основном статистика отражает следующий

  • a) выполненный оператор
  • b) Подсчет количества раз, которое он появляется в сетке
  • c) процент подсчета, которыйв основном это часть totalcounts, эта инструкция занимает
  • d) объединенную строку, содержащую время начала, продолжительность

»Статистика сначала генерируется как Datatable, используя цикл 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

}

»После заполнения таблицы данных я использую цикл для вычисления итоговой суммы

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;
}

Хотя все кажется нормальным, весь метод работает медленно с большим количеством строк.

  • Можете ли вы предложить методы для повышения производительности.

спасибо arvind

Ответы [ 2 ]

1 голос
/ 27 марта 2012

У меня есть несколько предложений,

вы можете использовать что-то подобное в своем цикле, используя 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()));
1 голос
/ 27 марта 2012

Поскольку вы анализируете текстовые журналы, это может повысить производительность, работая не в сетке, а в объектах.Кроме того, сетка может быть привязана к списку проанализированных журналов.Это может быть так:

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
}

Если вы хотите быть более производительным и модным, вы можете сохранить все проанализированные файлы журнала в базе данных и создать запросы для необходимых данных..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...