2010-01-25 4 views
3

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

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

Edit:

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

+1

Обычный тип сжатия, используемый для этого, - gzip. Поскольку вы отметили это с помощью «сервлета», я предполагаю, что вы работаете на Java, поэтому вы можете использовать java.util.zip.GZIPOutputStream. –

+0

, если важны производительность или использование памяти, есть SAX, StaX и VTD-XML для рассмотрения –

ответ

2

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

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

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

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

+0

Поскольку это был самый описательный и информативный пост, я выбрал это как ответ. – Woot4Moo

1

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

2

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

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

+0

. Скажем, ради моих подходов к обучению. У меня есть большой файл, который постоянно изменяется, и большой файл, который редко изменяется. – Woot4Moo

+0

Тестирование - это действительно лучший способ увидеть, что лучше всего работает. Gzip затем отправить, повторить 1000 раз, посмотреть, какое общее время. Сравните с отправкой без застежки. Также обязательно учитывайте ошибки передачи. – Eli

0

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

-1

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

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

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

+1

Извините, что вам пришлось использовать downvote из-за предложения регулярного выражения на xml, которое, как я видел, является плохим. Спасибо за второй бит. – Woot4Moo

Смежные вопросы