关于c#:在大数据表中设置DataRow值的性能

Performance of setting DataRow values in a large DataTable

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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秒。有什么简单的方法可以改善吗?


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

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

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


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

1
2
3
4
5
6
7
foreach (DataRow row in dt.Rows)
{
    for (int j = 0; j < 15; j++)
    {
        row[j] = 5;
    }
}

通过经验测试,您的方法在我的计算机上运行时间约为 1500 毫秒,而这个基于索引的版本运行时间约为 1100 毫秒。

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

在没有for循环的情况下为数据表中的所有行设置值


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

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

  • 将新值填入此列,

  • 删除旧列并在其位置插入新列。

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