XmlDocument xml = new XmlDocument();
//гружу файл
xml.Load("Activities.xml");
//перебираю коллекцию новых данных с сервера
foreach (MultimarkVisit visit in _MultimarkVisits)
{
XmlNode vnode = xml.SelectSingleNode("/Activities/Activity[@Id='" + visit.ID + "']");
if (vnode != null)
{
//заполняем XML узел всякими новыми данными
vnode.Attributes["CustId"].InnerText = visit.CustomerId;
vnode["StartDate"].InnerText = visit.VisitDate.ToString("dd.MM.yyyy");
vnode["Text"].InnerText = visit.Comments;
vnode["Who"].InnerText = visit.Visitor.ToUpper();
}
}
//сохраняем
xml.Save("Activities.xml");
[C#] Вставка множества записей в XML файл
Имеется XML файле с порядка 35тыс узлами.
С сервера получаются обновленные узлы из этого XML (2000-2500 узлов), их нужно обновить в XML. Они могут уже быть там но с различными значениями (разные версии), а могут и не быть в файле (на сервере создан новый узел).
Итак, проблема в том, что такая процедура занимает около двух минут по локальной сети. Есть ли возможность или идеи, каким образом можно ускорить этот процесс?
Куда быстрее в данном случае получается освобождать все 25тыс записей из файла и заливать их с сервера по новой.
Задача состоит в том, чтобы избежать полной перезагрузки всех узлов с сервера на клиент, а обновлять только те узлы, которые были или созданы на сервере (всмысле новые) или обновлены.
Мое решение выглядит так
Код:
Я понимаю, что решение дурацкое, но что-то не соображу или не знаю, как сделать проще и быстрее. В таком вот случае получается, что приходится пробегаться 2000 раз по 35тыс записям, ил 60млн сравнений.
Цитата: Daniel Lavrushin
Задача состоит в том, чтобы избежать полной перезагрузки всех узлов с сервера на клиент, а обновлять только те узлы, которые были или созданы на сервере (всмысле новые) или обновлены.
Я не знаю, насколько объемными являются данные в узлах, но мое первое решение было бы: 1) десериализовать файл с данными, построить соответствующие индекс по нему (Dictionary или SortedDictionary зависит от содержимого) 2) обновить объекты в индексе 3) сериализовать обратно.
Цитата: hardcase
Я не знаю, насколько объемными являются данные в узлах, но мое первое решение было бы: 1) десериализовать файл с данными, построить соответствующие индекс по нему (Dictionary или SortedDictionary зависит от содержимого) 2) обновить объекты в индексе 3) сериализовать обратно.
примерно 13 мегабайт.
создаю две коллекции. В одну гружу все записи из файла (т.е. 35тыс), в другую - обновленные с сервера (2тыс), потом их соединяю, очищаю XML файл полностью (RemoveAll) и потом сохраняю коллекцию в файл обратно скопом.
Как вам такое решение, или все равно некрасиво так делать? По крайней мере время выполнения сократилось от 2 минут до 5-10 секунд.
Цитата: Daniel Lavrushin
Как вам такое решение, или все равно некрасиво так делать? По крайней мере время выполнения сократилось от 2 минут до 5-10 секунд.
Мне-то какая разница :) судить вам - приемлемое решение это или нет.
Хотя вы не показали схему данных, я все же считаю, что работа с xml документом посредством стандартного XmlSerializer была бы быстрее (имею в виду загрузку и выгрузку данных), но, конечно, нужно сравнивать.