Есть ли способ ускорить datatable.LoadDataRow()?

Я обновляю таблицу данных, звоня 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 Гц. Но как только я получаю больше значений, чем обычно (скажем, 200), он растет экспоненциально, и я получаю ~0,2 Гц. Это слишком медленно.

Кто-нибудь имеет какие-либо идеи, почему я получаю экспоненциальное замедление, когда у меня большие подсчеты? Это как-то связано с OverWriteChanges(который, я уверен, мне нужен по другим причинам); или, возможно, создание объекта в LoadDataRowили есть какая-то другая причина?

Я играл с разными 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();
    }
}

Также обязательно возобновите нормальную обработку в случае сбоя.

Другие вопросы по тегам