парсинг open-uri и sax для гигантского xml-документа

Мне нужно подключиться к внешнему XML-файлу для загрузки и обработки (300 МБ +). Затем просмотрите XML-документ и сохраните элементы в базе данных.

Я уже делаю это без проблем на производственном сервере с помощью Saxerator для бережного отношения к памяти. Работает отлично. Вот моя проблема сейчас -

Мне нужно использовать open-uri (хотя могут быть альтернативные решения?), Чтобы захватить файл для анализа. Эта проблема заключается в том, что open-uri должен загрузить весь файл, прежде чем что-либо начнет синтаксический анализ, что сводит на нет всю цель использования SAX Parser для экономии памяти ... какие-либо обходные пути? Могу я просто прочитать из внешнего XML-документа? Я не могу загрузить весь файл, или мой сервер выйдет из строя, и, поскольку документ обновляется каждые 30 минут, я не могу просто сохранить его копию на своем сервере (хотя это то, что я делаю в настоящее время, чтобы убедиться, что все id работает. ).

Я делаю это, Руби, p.s.


person Noah Davis    schedule 07.02.2014    source источник


Ответы (2)


Вы можете попробовать Net :: HTTP streaming interface вместо open-URI. Это даст Saxerator (через базовый Nokogiri :: SAX :: Parser) объект ввода-вывода, а не весь файл.

person Mark Thomas    schedule 10.02.2014
comment
это именно то, что я искал. Большое тебе спасибо! - person Noah Davis; 11.02.2014
comment
Просто хотел сказать, что я это реализовал и отлично работает. - person Noah Davis; 14.02.2014

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

Я всегда так обрабатывал большие внешние файлы xml.

XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
xmlReader.setFeature("http://xml.org/sax/features/namespaces", true);
XMLFilter filter = new XMLFilterImpl();

filter.setParent(xmlReader);

filter.parse(new InputSource(new BufferedReader(new InputStreamReader(new URL("<url to external document here>").openConnection().getInputStream(),"UTF8"))));
person Randyaa    schedule 07.02.2014