проблема с огромными данными - PullRequest
2 голосов
/ 21 июня 2011

У меня есть служба WCF, которая читает данные из XML.Данные в xml меняются каждую минуту.Этот xml очень большой, в нем около 16 тыс. Записей.Разбор занимает около 7 сек.так что это определенно долго.

Теперь все работает следующим образом:

  1. вызов ASP.NET WCF
  2. синтаксический анализ WCF xml
  3. ASP.NET ожидает обратного вызова WCF
  4. WCF возвращает данные в ASP.NET

, конечно, кэширование выполняется в течение 1 минуты, но после этого WCF должен загрузить данные снова.

Есть ли возможностьсделать что-то, что будет обновлять данные без остановки сайта?Что-то вроде ... я не знаю, двойная буферизация?что будет извлекать старые данные, если нет новых?Может быть, вы знаете лучшее решение?

С наилучшими пожеланиями

РЕДАКТИРОВАТЬ: утверждение, которое занимает больше всего времени:

        XDocument = XDocument.Load(XmlReader.Create(uri)); //takes 7 sec.

анализ занимает 70 мс, это хорошо, но этоне проблема.Есть ли лучшее решение, чтобы не блокировать сайт?:)

EDIT2: Хорошо, я нашел лучшее решение.Просто я загружаю XML на жесткий диск и читаю данные с него.Затем другой процесс начинает загружать новую версию XML и заменять старую.Спасибо за участие.

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

У вас, похоже, есть инструмент XML to Object, который создает объектную модель из XML.

Обычно большую часть времени занимает не анализ, а создание всех этих объектов для представления данных.

Таким образом, вы можете извлечь только часть данных XML, которая будет быстрее для вас, а не систематически создавать большое дерево объектов для извлечения только его части.

Вы можете использовать XPath для извлечения фрагментоввам нужен файл XML, например.

В прошлом я использовал хороший инструмент для разбора XML, который фокусируется на производительности.Он называется vtd-xml (см. http://vtd -xml.sourceforge.net / ).

Он поддерживает XPath и другие технологии XML.

Существует версия C #.Я использовал версию Java, но уверен, что версия C # обладает теми же качествами.

LINQ to XML - это также хороший инструмент, и он может помочь вам.

1 голос
/ 21 июня 2011

Все зависит от вашего дизайна базы данных. Если вы спроектировали базу данных таким образом, чтобы вы могли распознать, какие данные уже были запрошены, то для каждого нового запроса выдается только разница записей от времени последнего запроса до текущего времени.

Может быть, вы могли бы добавить метку строки для каждой записи и обновлять ее при каждом действии добавления / редактирования / удаления, тогда вы можете легко достичь логики с самого начала этого ответа.

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

Используйте что-то еще, кроме XML (например, JSON). Если у вас большие накладные расходы на XML, попробуйте заменить длинные имена элементов чем-то более коротким (например, одним именем элемента char).

Взгляните на это:

  1. Какой самый простой способ добавить сжатие к WCF в Silverlight?
  2. Создание JSON из C # с использованием библиотеки JSON
0 голосов
/ 21 июня 2011

Если вы сделаете несколько стековых снимков , это может сказать вам, что самым большим «узким местом» является не синтаксический анализ, а распределение структуры данных, инициализация и последующий сбор мусора.Если это так, то можно обойти это путем создания пула предварительно выделенных объектов строк и их повторного использования.

Кроме того, если каждый элемент добавляется в список, вы можете обнаружить, что он тратит большую долювремя делаю допд.Может быть, быстрее будет просто нажать каждую новую строку впереди, а затем полностью перевернуть весь список в конце.

(Но не реализуйте эти вещи, пока не докажете, что это проблемы с помощью стеков. До тех пор,это всего лишь догадки.)

По моему опыту, реальная стоимость XML заключается не в разборе, а в манипулировании структурой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...