在大型DataTable中设置DataRow值的性能

时间:2012-12-15 19:48:27

标签: c# performance datatable datarow

我有一个大的DataTable - 大约15000行和100列 - 我需要为每一行中的某些列设置值。

// Creating the DataTable
DataTable dt = new DataTable();
for (int i = 0; i < COLS_NUM; i++)
{
    dt.Columns.Add("COL" + i);
}    
for (int i = 0; i < ROWS_NUM; i++)
{
    dt.Rows.Add(dt.NewRow());
}

// Setting several values in every row
Stopwatch sw2 = new Stopwatch();
sw2.Start();
foreach (DataRow row in dt.Rows)
{
    for (int j = 0; j < 15; j++)
    {
        row["Col" + j] = 5;
    }
}
sw2.Stop();

上述测量时间约为4.5秒。有没有简单的方法可以改善这个?

3 个答案:

答案 0 :(得分:2)

在填充数据之前,请调用DataTable上的BeginLoadData()方法。完成加载数据后,调用EndLoadData()。这将关闭所有通知,索引维护和约束,这将提高性能。

作为替代方案,在更新每一行之前调用BeginEdit(),并在完成该行的编辑时调用EndEdit()。

这是一个链接,其中包含有关提高DataSet性能的更多信息: http://www.softwire.com/blog/2011/08/04/dataset-performance-in-net-web-applications/

答案 1 :(得分:1)

我能想到的一个改进是按索引编辑列,而不是名称。

foreach (DataRow row in dt.Rows)
{
    for (int j = 0; j < 15; j++)
    {
        row[j] = 5;
    }
}

通过实证测试,您的方法似乎在我的计算机上运行~1500毫秒,而这个基于索引的版本运行在~1100毫秒。

另外,请参阅Marc在这篇文章中的回答:

Set value for all rows in a datatable without for loop

答案 2 :(得分:0)

这取决于您的业务逻辑,但在您的问题中并不清楚,但是,如果要为每行中的某些列设置值,请尝试以下操作,

  • 创建一个单独的临时列,您可以在同一个列中创建它 创建原始数据表时循环

  • 将新值填入此列

  • 删除旧列并将其替换为新列。

如果您可以期望新值或者如果您对所有行具有相同的值(如您的示例中)或者如果您有某种重复,则此解决方案将是合乎逻辑的,在这种情况下,添加带有加载的新列比循环所有行要快得多。