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





Лично я бы старался избегать файлов XML такого размера. Это один из недостатков XML: вам нужно прочитать файл целиком, прежде чем вы сможете его использовать.
Разве ваша база данных не может возвращать меньшие части XML с тем, что вам нужно, вместо всего сразу? Это может быть немного сложнее настроить, но в конечном итоге может оказаться гораздо более масштабируемым.
Вам нужен синтаксический анализатор SAX XML - он может анализировать поток, не читая его целиком. Однако я не могу найти его для AS3 (хотя есть и другие люди, которые ищут то же самое).
SAX работает, вызывая события, когда элементы пересекают входной поток. Довольно удобно - я часто использовал его в прошлом, и как только вы с ним познакомитесь, он будет полезен во многих случаях. Он работает даже с открытым сокетом, где поток никогда не закрывается.
Вы определенно столкнетесь с некоторыми проблемами производительности при синтаксическом анализе XML-файла такого размера. Еще в Flex 2 дня мы использовали SOAP для служб, и у нас был один вызов данных, который вернул около 5К записей, и Flash Player зависал / браузер не отвечал примерно на 10 секунд на достаточно быстрой машине. Я не могу вспомнить размер этого сообщения SOAP, но он не мог быть больше 1-2 МБ.
Если ваш бэкэнд сможет преобразовать XML в граф объектов и отправить его обратно через AMF, вы увидите гораздо лучшую производительность. Flash Player отлично справляется с большими наборами данных при условии, что они закодированы в AMF (сжатый двоичный формат).
Даже все же, я бы действительно подумал, хотите ли вы отправить один такой большой результат или разбить его на части. По крайней мере, таким образом у вас есть путь для лучшего масштабирования и вы можете дать пользователю лучшую обратную связь, то есть отобразить сообщение, такое как «Обработка элемента 6 из 35 ...»
Спасибо за это, я борюсь с той же проблемой, и ответ может заключаться в том, чтобы поговорить с рубиновым сервером или что-то в этом роде ... это начинает раздражать. stackoverflow.com/questions/1159154/…
Та же проблема (да, я знаю, что Flash ужасающе устарел. Это не соответствует реалиям бизнеса). Мне также понадобится промежуточный синтаксический анализатор, чтобы уменьшить размер полезной нагрузки. Очень расстраивает то, что я не могу представить свой собственный парсер потока для оптимизации синтаксического анализа (например, упомянутый dkretz)
Как уже говорили другие, синтаксический анализ больших объемов XML не рекомендуется и может быть довольно вялым. Было заявлено, что самый быстрый способ передачи данных между флэш-клиентом и сценарием на стороне сервера - это двоичный формат AMF (Action Message Format). Если вы когда-либо делали что-либо с классом SharedObject, значит, вы уже имели дело с AMF, поскольку это формат, в котором он записывает LSO на ваш жесткий диск. AMFPHP был лучшим решением для этого до недавнего времени, так как теперь он поддается фреймворку Zend, а точнее теперь это ZendAMF.
Есть отличное руководство здесь, написанное Ли Бримелоу, одним из разработчиков flash, которых я ищу для вдохновения и ясности, в котором показано, как использовать ZendAMF.
Скорость, с которой ваши данные доступны с помощью ZendAMF, по сравнению с обычным старым XML, ошеломляет, и чем больше данных, которые нужно проанализировать, тем заметнее.
Как уже упоминалось, лучше всего подойдет синтаксический анализатор 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/
Я начал использовать JSON вместо XML, надеясь избежать этих проблем, и это то же самое ... Когда размер файла превышает 50 МБ, он не работает.
В SQL всегда есть предложение WHERE, потому что никто не хочет видеть больше 100 результатов.
У вас может не быть контроля над исходным XML-файлом, но, возможно, вы можете вставить что-то на стороне сервера, которое выполняет синтаксический анализ и извлечение данных, которые вам действительно нужны.
Ваше здоровье
Что касается сравнения скорости между XML и JSON, на самом деле я провел сравнение трех видов скорости для тяжелых больших данных - XML, JSON и BlazeDS. Поверьте, BlazeDS будет быстрее всего. Это действительно быстрее.
Хорошая точка зрения. Но у меня даже возникают проблемы с обработкой больших XML-файлов в AIR! stackoverflow.com/questions/1159154/…