2013-04-16 3 views
2

Я работаю над приложением, которое необходимо хранить большой 2GB + файл XML для обработки, и я столкнулся с двумя проблемами:Хранение и обработка больших файлов XML с помощью Heroku?

  1. Как обработать этот файл? Загрузка всего файла в Нокигири сразу не сработает. Он быстро поглощает память, и, насколько я могу судить, процесс сбрасывается с орбиты. Существуют ли совместимые с Heroku способы быстрого/легкого чтения большого XML-файла, расположенного на сервере без Heroku, в небольших кусках?
  2. Как сохранить файл? Сайт настроен на использование S3, но провайдеру данных необходим FTP-доступ для загрузки XML-файла в ночное время. S3 через FTP, по-видимому, не работает, и сохранение файла на Heroku тоже не будет работать, так как это будет видно только дино, которому принадлежит его, и подвержено случайному удалению. Кто-нибудь сталкивался с этим типом ограничений раньше, и если да, то как вы его обходите?
+0

Используйте расширенный VTD-XML, вы можете сделать xpath (полный набор) по XML-файлам размером до 256 ГБ. –

ответ

1

Большая часть времени мы предпочитаем разбор весь файл, который был вытянут в память, потому что легче прыгать взад и вперед, извлекая это, и что, как наши потребности коды. Поскольку это в памяти, мы можем сделать произвольный доступ легко, если хотим.

Для вашей потребности вы захотите начать в верхней части файла и прочитать каждую строку, ища интересующие теги, пока не дойдете до конца файла. Для этого вы хотите использовать Nokogiri::XML::SAX и Nokogiri::XML::SAX::Parser, а также события в Nokogiri::XML::SAX::Document. Вот краткое описание того, что он делает, с сайта Nokogiri в:

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

SAX - это другое зверь, чем работа с DOM, но он может быть очень быстрым и намного проще в памяти.

Если вы хотите загрузить файл в более мелкие куски, вы можете обработать XML внутри блока OpenURI.open или Net::HTTP, так что вы получите его в кусках размера пакета TCP. Проблема в том, что ваши строки могут быть разделены, потому что TCP не гарантирует чтение по строкам, а по блокам, что вы увидите внутри цикла чтения. Ваш код должен будет отключить частичные строки в конце буфера, а затем добавить их в буфер чтения, чтобы следующий считываемый блок завершил линию.

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