Есть ли способ ускорить 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();
}
}
Также обязательно возобновите нормальную обработку в случае сбоя.