Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C#] Вставка множества записей в XML файл

29K
19 ноября 2009 года
Daniel Lavrushin
30 / / 26.10.2008
Привет, возникла необходимость вставлять в уже полный XML файл множество узлов.

Имеется XML файле с порядка 35тыс узлами.

С сервера получаются обновленные узлы из этого XML (2000-2500 узлов), их нужно обновить в XML. Они могут уже быть там но с различными значениями (разные версии), а могут и не быть в файле (на сервере создан новый узел).

Итак, проблема в том, что такая процедура занимает около двух минут по локальной сети. Есть ли возможность или идеи, каким образом можно ускорить этот процесс?
Куда быстрее в данном случае получается освобождать все 25тыс записей из файла и заливать их с сервера по новой.

Задача состоит в том, чтобы избежать полной перезагрузки всех узлов с сервера на клиент, а обновлять только те узлы, которые были или созданы на сервере (всмысле новые) или обновлены.

Мое решение выглядит так
Код:
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");


Я понимаю, что решение дурацкое, но что-то не соображу или не знаю, как сделать проще и быстрее. В таком вот случае получается, что приходится пробегаться 2000 раз по 35тыс записям, ил 60млн сравнений.
5
19 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Daniel Lavrushin

Задача состоит в том, чтобы избежать полной перезагрузки всех узлов с сервера на клиент, а обновлять только те узлы, которые были или созданы на сервере (всмысле новые) или обновлены.

Я не знаю, насколько объемными являются данные в узлах, но мое первое решение было бы: 1) десериализовать файл с данными, построить соответствующие индекс по нему (Dictionary или SortedDictionary зависит от содержимого) 2) обновить объекты в индексе 3) сериализовать обратно.

29K
19 ноября 2009 года
Daniel Lavrushin
30 / / 26.10.2008
Цитата: hardcase
Я не знаю, насколько объемными являются данные в узлах, но мое первое решение было бы: 1) десериализовать файл с данными, построить соответствующие индекс по нему (Dictionary или SortedDictionary зависит от содержимого) 2) обновить объекты в индексе 3) сериализовать обратно.

примерно 13 мегабайт.

29K
19 ноября 2009 года
Daniel Lavrushin
30 / / 26.10.2008
Сделал такое решение

создаю две коллекции. В одну гружу все записи из файла (т.е. 35тыс), в другую - обновленные с сервера (2тыс), потом их соединяю, очищаю XML файл полностью (RemoveAll) и потом сохраняю коллекцию в файл обратно скопом.

Как вам такое решение, или все равно некрасиво так делать? По крайней мере время выполнения сократилось от 2 минут до 5-10 секунд.
5
19 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Daniel Lavrushin
Как вам такое решение, или все равно некрасиво так делать? По крайней мере время выполнения сократилось от 2 минут до 5-10 секунд.

Мне-то какая разница :) судить вам - приемлемое решение это или нет.
Хотя вы не показали схему данных, я все же считаю, что работа с xml документом посредством стандартного XmlSerializer была бы быстрее (имею в виду загрузку и выгрузку данных), но, конечно, нужно сравнивать.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог