在 C# 中,在大型数据集上合并数据表中的行速度很慢

本文关键字:数据表 速度 大型 数据集 合并 | 更新日期: 2023-09-27 18:32:55

我有一个数据表,其中包含来自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;
    }

在 C# 中,在大型数据集上合并数据表中的行速度很慢

好的,

我决定研究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();