Разбор больших файлов XML в Adobe Flex - PullRequest
4 голосов
/ 08 декабря 2008

Я работаю над приложением Adobe Flex, которому нужно проанализировать релятивлейский большой XML-файл. Банкомат это только 35 МБ, но в идеальном мире станет намного больше в будущем. ** Изменить: я не могу контролировать файл XML

По сути, я помещаю его содержимое прямо в базу данных SQLITE, поэтому я мог бы использовать класс SimpleXML, чтобы превратить его в объект, а затем выполнить итерацию по нему, но я беспокоюсь, что это будет плохим подходом, поскольку файл становится больше , Я параноик, или есть лучший способ сделать это?

Ответы [ 7 ]

4 голосов
/ 08 декабря 2008

У вас наверняка возникнут некоторые проблемы с производительностью при разборе такого большого XML-файла. Вернувшись во Flex 2 дня, мы использовали SOAP для сервисов, и у нас был один вызов данных, который возвращал около 5 тыс. Записей, и проигрыватель Flash Player зависал / браузер зависал в течение 10 секунд на достаточно быстрой машине. Я не могу вспомнить размер этого SOAP-сообщения, но оно не могло превышать 1-2 МБ.

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

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

3 голосов
/ 08 декабря 2008

То, что вы хотите, - это синтаксический анализатор SAX XML - он может анализировать поток, не читая всего этого. Хотя я не могу найти его для AS3 (хотя есть другие люди, которые ищут то же самое)

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

1 голос
/ 06 января 2009

Как уже упоминалось, парсер SAX был бы вашим лучшим выбором, чтобы вы могли обрабатывать каждое «событие» (узел) во время чтения, а не использовать парсер DOM для чтения всего файла XML и сохранения его в памяти.

Но если вы собираетесь использовать такие большие наборы данных, возможно, вы могли бы подумать об экспорте данных SQLite в формате JSON, а не в XML?

Я не уверен, как именно экспортировать SQLite напрямую в JSON (без написания собственного скрипта для этого), однако в сообщении в списке рассылки sqlite-users предлагается попробовать следующий неподдерживаемый / недокументированный исходный код: http://www.ch -werner.de / sqliteodbc / sqlite3json.tgz

Учебное пособие по использованию JSON во Flex можно найти по адресу http://www.mikechambers.com/blog/2006/03/28/tutorial-using-json-with-flex-2-and-actionscript-3/

1 голос
/ 19 декабря 2008

Как уже говорили другие, синтаксический анализ большого количества XML не рекомендуется и может стать довольно вялым. Было заявлено, что самый быстрый способ передачи данных между флэш-клиентом и сценарием на стороне сервера - это двоичный формат AMF (Action Message Format). Если вы когда-нибудь что-то делали с классом SharedObject, то у вас уже было какое-то дело с AMF, так как это формат, в котором он записывает LSO на ваш жесткий диск. До недавнего времени AMFPHP был лучшим решением для этого, поскольку теперь он подходит для платформы Zend, точнее, теперь это ZendAMF.

Здесь есть отличное учебное пособие здесь от Ли Бримелоу, одного из разработчиков флэш-памяти, к которому я обращаюсь за вдохновением и ясностью, которое показывает, как использовать ZendAMF.

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

1 голос
/ 08 декабря 2008

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

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

0 голосов
/ 14 декабря 2009

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

0 голосов
/ 07 января 2009

В SQL всегда есть предложение WHERE, потому что никто никогда не хочет видеть более 100 результатов.

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

Приветствия

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