C# 在C语言中,在大型数据集上合并datatable中的行速度较慢

C# 在C语言中,在大型数据集上合并datatable中的行速度较慢,c#,.net,datatable,C#,.net,Datatable,我有一个数据表,其中包含来自cassandra数据库的统计数据 通常在20k-45k行的区域内有很多行 行被划分为小时,我需要将它们合并为天 我现在的代码处理一行只需要大约1-3毫秒,但是如果有45k行或更多行,它仍然需要相当长的时间 所以我想知道是否有更好的方法 任何想法都将不胜感激 现行代码 public static DataTable CollateResult(DataTable table) { DataTable m_table = table.Copy()

我有一个数据表,其中包含来自cassandra数据库的统计数据

通常在20k-45k行的区域内有很多行

行被划分为小时,我需要将它们合并为天

我现在的代码处理一行只需要大约1-3毫秒,但是如果有45k行或更多行,它仍然需要相当长的时间

所以我想知道是否有更好的方法 任何想法都将不胜感激

现行代码

public static DataTable CollateResult(DataTable table)
    {
        DataTable m_table = table.Copy();
        foreach (DataRow row in table.Rows)
        {
            string m_date = DateTime.Parse(row["event_time"].ToString()).ToString("yyyy-MM-dd");
            if (m_table.Rows.Count > 0 && m_table.Rows[m_table.Rows.Count - 1]["event_time"].ToString().Equals(m_date))
            {
                foreach (DataColumn column in table.Columns)
                {
                    if (!column.ColumnName.Equals("event_time") && !column.ColumnName.Equals("application_id") && !column.ColumnName.Equals("country") && !column.ColumnName.Equals("package"))
                    {
                        m_table.Rows[m_table.Rows.Count - 1][column.ColumnName] =
                            (int.Parse(m_table.Rows[m_table.Rows.Count - 1][column.ColumnName].ToString()) + int.Parse(row[column.ColumnName].ToString()));
                    }
                    else
                    {
                        if (!column.ColumnName.Equals("event_time"))
                            m_table.Rows[m_table.Rows.Count - 1][column.ColumnName] = row[column.ColumnName].ToString();
                    }
                }
            }
            else
            {
                DataRow m_row = m_table.NewRow();
                foreach (DataColumn column in table.Columns)
                {
                    if (column.ColumnName.Equals("event_time"))
                        m_row["event_time"] = m_date;
                    else
                        m_row[column.ColumnName] = row[column.ColumnName];
                }
                m_table.Rows.Add(m_row);
            }
        }
        return m_table;
    }

好的,我决定研究linq,因为它有我需要的sql函数。。 所以这就是我问题的解决方案:

        List<StatsResult> m_results =
                (
                  from row in m_table.AsEnumerable()
                  group row by new {
                      EventTime = row.Field<string>("event_time"),
                      Package = row.Field<string>("package"),
                      Name = row.Field<string>("name"),
                      Country = row.Field<string>("country")
                  } into g
                  select new StatsResult()
                  {
                      event_time = g.Key.EventTime,
                      package = g.Key.Package,
                      name = g.Key.Name,
                      country = g.Key.Country,
                      ActiveUsers = g.Sum(x => x.Field<long>("ActiveUsers")),
                      MonthlyActiveUsers = g.Sum(x => x.Field<long>("MonthlyActiveUsers"))
                  }
                ).ToList();

你不会合并成几天,而是聚合起来。这是一个巨大的差异。聚合意味着使用聚合函数,如Sum、Avg、Count和groupings。不要将数据表视为二维数组并进行迭代,而是使用过滤器和聚合来过滤所需的行,按天分组,然后对所需的值求和。更好的是,在SQL中这样做。相应的SQL语句非常简单,可能会运行faster@mybirthname我对此不确定。代码非常复杂,显示出对数据表的不熟悉。它将被传递回给SO@n-dev只是解释你想做什么,而不是你认为应该怎么做。你想按哪个字段过滤,按哪个列分组,生成什么和?有很多重复,不确定你想在这里实现什么。我知道我可能弄错了!我有一个带有日期的事件时间列,我可以选择自己的格式。事件时间、国家、应用程序id和包是我想要分组的列,因此我每天有一行、国家、应用程序id,打包表中的所有其他列都是来自cassandra的计数器值,需要一起添加到sql中的每日值中。我将使用group by语句,但cassandra似乎不支持这一点