Разбор больших XML-файлов по сети - PullRequest
3 голосов
/ 26 января 2010

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

В случае возникновения путаницы возникает вопрос: «Каковы некоторые рекомендации по отправке больших файлов XML по сетям?»

Edit:

Я вижу, как много говорят о сжатии, какой-либо конкретный алгоритм сжатия, который можно использовать и с точки зрения распаковки указанных файлов? У меня нет особого желания раскручивать свои собственные, когда я знаю, что существуют проверенные алгоритмы. Также я ценю ответы до сих пор.

Ответы [ 5 ]

2 голосов
/ 26 января 2010

Сжатие и уменьшение размера XML уже более десяти лет является проблемой, особенно в мобильной связи, где пропускная способность и вычислительные мощности клиентов ограничены. Конечное решение, используемое в беспроводной связи, которое я предпочитаю использовать, если у меня достаточно контроля на стороне клиента и сервера, - WBXML ( WAP Binary XML Spec ).

Эта спецификация определяет, как преобразовать XML в двоичный формат, который не только компактен, но и прост для анализа. Это отличается от методов сжатия общего назначения, таких как gzip, которые требуют высокой вычислительной мощности и памяти на стороне приемника для распаковки и последующего анализа содержимого XML. Единственным недостатком этой спецификации является то, что таблица токенов приложения должна существовать с обеих сторон, которая является статически определенной кодовой таблицей, чтобы хранить двоичные значения для всех возможных тегов и атрибутов в XML-контенте приложения. Сегодня этот формат широко используется в мобильной связи для передачи конфигурации и данных в большинстве приложений, таких как конфигурация OTA и синхронизация контактов / заметок / календаря / электронной почты.

Для передачи большого XML-контента с использованием этого формата вы можете использовать механизм разбиения на блоки, аналогичный тому, который предложен в протоколе SyncML. Вы можете найти проектный документ здесь , описывающий этот механизм в разделе «2.6. Обработка больших объектов». Как краткое вступление:

Эта функция предоставляет средства для синхронизации объекта, размер которого превышает размер, который может быть передан в одном сообщении (например, максимальный размер сообщения - объявлен в MaxMsgSize). элемент - то, что целевое устройство может получить). Это достигается путем разбиения объекта на куски, каждый из которых поместится в одном сообщении, и последовательной их отправки. Первая порция данных отправляется с общим размером объекта и тегом MoreData, сигнализирующим, что будет отправлено больше порций. Каждый последующий блок отправляется с тегом MoreData, кроме последнего.

2 голосов
/ 26 января 2010

В зависимости от того, насколько оно велико, вы можете сначала рассмотреть возможность его сжатия. Это, конечно, зависит от того, как часто отправляются одни и те же данные и как часто они меняются.

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

1 голос
/ 26 января 2010

Сжатие является очевидным подходом. Этот XML-жучок будет уменьшаться, как будто завтра не наступит.

0 голосов
/ 26 января 2010

Читаете ли вы XML с помощью правильного синтаксического анализатора XML, или вы читаете его с ожиданиями конкретного макета?

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

Если у вас есть код, который может переваривать XML-узел за раз, то выплюните его за один раз, используя что-то вроде Transfer-Encoding: chunked. Вы записываете длину фрагмента (в шестнадцатеричном формате), за которым следует фрагмент, затем другой фрагмент или «0 \ n» в конце. Чтобы сэкономить пропускную способность, gzip каждый кусок.

0 голосов
/ 26 января 2010

Если вы можете хранить локальную копию и две копии на сервере, вы можете использовать diffxml , чтобы уменьшить то, что вы должны передать, только изменениям, а затем bzip2 различия. Это значительно уменьшит требования к пропускной способности за счет некоторого объема памяти.

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