【问题标题】:Is there any way to speed up datatable.LoadDataRow()?有什么方法可以加快 datatable.LoadDataRow() 的速度吗?
【发布时间】:2013-05-07 18:01:13
【问题描述】:

我正在通过调用DataTable.LoadDatatRow刷新一个数据表,如下:

public void FillTable(DataTable myTable, IEnumerable<MyObject> readings)
{
    var index=0;

    foreach(var reading in readings) {
        LoadRow(myTable, reading, index++); 
    }
}

protected override void LoadRow(DataTable table, MyObject objectValue, int index)
{
    table.LoadDataRow(
        new object[] { 
            objectValue.property1 + "a", 
            objectValue.property2 + "b", 
            /* ... etc. */
        }, LoadOption.OverwriteChanges);
}

现在,为了便于阅读,这有点简化,LoadDataRow 行有点长(大约 9 个数组值),但不包含大的函数调用或任何东西,只是格式化字符串和一些 ? 案例。当我的表中有约 50 个值时,此代码可以正常工作,并且刷新频率约为 10 Hz。但是一旦我得到比正常更多的值(比如 200),它就会呈指数增长,我得到 ~0.2 Hz。这太慢了。

有谁知道为什么当我有大量可枚举的读数时,我的速度会呈指数级下降?是否与OverWriteChanges有关(我很确定我需要其他原因);或者可能在LoadDataRow 中创建一个对象,还是有其他原因?

我玩过不同的LoadOptions,这似乎不是问题。我只是无法解释为什么我看到处理时间如此巨大的增加,而且我不知道如何解决它。

【问题讨论】:

  • 您的数据表是否设置了主键?
  • 是的,我有:myTable.PrimaryKey = new[] { myTable.Columns["ParentID"], myTable.Columns["ID"] };回到我初始化表的地方。

标签: c# performance datatable ienumerable loadoptions


【解决方案1】:

在调用 LoadRow 之前和之后添加对 BeginLoadData() 和 EndLoadData() 的调用。

BeginLoadData 关闭与新数据处理相关的事件通知、索引维护和约束检查。这可以提高 LoadDataRow 的性能。

public void FillTable(DataTable myTable, IEnumerable<MyObject> readings)
{
    var index=0;
    try
    {
        dt.BeginLoadData();
        foreach(var reading in readings) {
            LoadRow(myTable, reading, index++); 
        }
    }
    finally
    {
        dt.EndLoadData();
    }
}

也一定要在失败的情况下恢复正常处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2016-02-16
    • 2015-08-30
    相关资源
    最近更新 更多