C# 在C语言中,在大型数据集上合并datatable中的行速度较慢
我有一个数据表,其中包含来自cassandra数据库的统计数据 通常在20k-45k行的区域内有很多行 行被划分为小时,我需要将它们合并为天 我现在的代码处理一行只需要大约1-3毫秒,但是如果有45k行或更多行,它仍然需要相当长的时间 所以我想知道是否有更好的方法 任何想法都将不胜感激 现行代码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()
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似乎不支持这一点