Повышение производительности десериализации из больших строк XML - PullRequest
2 голосов
/ 10 января 2012

Я анализирую большой XML-файл (1 МБ) в моем приложении WP7.Файл является частью проекта, поэтому он не загружается через Интернет.К сожалению, это занимает очень много времени, ок.3 секунды, чтобы получить контент, который мне нужен.Я прочитал, что проблема заключается в сериализации XML, и лучше пойти на двоичную сериализацию.

Но у меня есть мой файл XML, есть ли возможность изменить формат или что-то из моего файла XML, так что разбор пойдет быстрее?Я уже разбил его на многие части, но он не имеет значения быстрее.

Ответы [ 3 ]

1 голос
/ 10 января 2012

1 мегабайт не особо большой.

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

Если вы хотите придерживаться XML, обычно вы можете значительно улучшить производительность, используя краткий, компактный формат:

  • использовать короткие имена для элементов и атрибутов: например, v, а не вертексентри.
  • использовать самозакрывающиеся элементы с данными в атрибутах, а не cdata или дочерние элементы, содержащие отдельные значения. Обычно это получается более компактно.
  • если у вас есть список простых значений, рассмотрите возможность использования единственного строкового значения, содержащего список через запятую, а не множества отдельных элементов / атрибутов. например используйте p = "12,22" вместо x = "12" y = "22". Это меньше данных для чтения, меньше элементов для анализа и вдвое меньше вызовов методов для чтения значений из элемента / считывателя xml.
  • хранит только полезную точность. Двойник, преобразованный в строку, использует много цифр. Если вам нужно только 3 знака после запятой, сохраняйте только 3d.p.

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

Наконец, попробуйте другие подходы - XmlDocument, а не XmlReader, или другую библиотеку, или предварительную загрузку данных в MemoryStream. Там тоже можно найти улучшения.

Или просто скажите своему боссу, что это потому, что у вас нет восьмиядерного Xeon с терабайтом быстрой SSD ... :-)

0 голосов
/ 10 января 2012

У вас есть как минимум четыре варианта:

  • Используйте самый быстрый доступный десериализатор XML. Вы можете найти здесь хорошее сравнение. SharpSerializer, кажется, самый быстрый.
  • Вы можете написать свой собственный двоичный десериализатор и сериализатор.
  • Вы можете использовать ядро ​​базы данных SQL CE.
  • Вы можете поместить данные на веб-сервер и предоставить веб-сервис для запроса данных. Но теперь у вас есть вопрос, как хранить данные на сервере. Сервер обычно работает быстрее телефона, но ...
0 голосов
/ 10 января 2012

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

Кроме того, если в сериализации есть какие-либо дополнительные данные, вы всегда можете придумать собственную XML-схему, которая является менее подробной и содержит только необходимую информацию.

...