У меня есть набор данных ADO, который я загружаю из его XML-файла через ReadXml. Данные и схема находятся в отдельных файлах.
В данный момент загрузка этого набора данных занимает около 13 секунд. Я могу сократить это до 700 миллисекунд, если я не читаю схему DataSet и просто позволяю ReadXml выводить схему, но тогда результирующий DataSet не содержит никаких ограничений.
Я пытался сделать это:
Console.WriteLine("Reading dataset with external schema.");
ds.ReadXmlSchema(xsdPath);
Console.WriteLine("Reading the schema took {0} milliseconds.", sw.ElapsedMilliseconds);
foreach (DataTable dt in ds.Tables)
{
dt.BeginLoadData();
}
ds.ReadXml(xmlPath);
Console.WriteLine("ReadXml completed after {0} milliseconds.", sw.ElapsedMilliseconds);
foreach (DataTable dt in ds.Tables)
{
dt.EndLoadData();
}
Console.WriteLine("Process complete at {0} milliseconds.", sw.ElapsedMilliseconds);
Когда я делаю это, чтение схемы занимает 27 мс, а чтение DataSet занимает 12000+ миллисекунд. И это время, сообщенное до . Я вызываю EndLoadData для всех таблиц данных.
Это не огромный объем данных - он составляет около 1,5 МБ, нет вложенных отношений, и все таблицы содержат два или три столбца из 6-30 символов. Единственное, что я могу понять, это другое, если я прочитал схему заранее, это то, что схема включает в себя все уникальные ограничения. Но BeginLoadData должен отключать ограничения (а также уведомления об изменениях и т. Д.). Так что это не должно применяться здесь. (И да, я попытался просто установить EnforceConstraints в false.)
Я читал много сообщений о людях, улучшающих время загрузки DataSets, сначала читая схему, а не заставляя объект выводить схему. В моем случае вывод схемы делает процесс примерно в 20 раз быстрее, чем схема, предоставленная явно.
Это сводит меня с ума. Схема этого DataSet генерируется на основе метаинформации, и у меня возникает соблазн написать метод, который создает его программно и просто десерализует его с помощью XmlReader. Но я бы предпочел не делать этого.
Чего мне не хватает? Что еще я могу сделать, чтобы улучшить скорость здесь?