Парсинг очень большого XML-файла с помощью Ruby on Rails (1,4 ГБ) - PullRequest
4 голосов
/ 18 мая 2010

В настоящее время я использую LIBXML :: SAXParser :: Callbacks для анализа большого XML-файла, содержащего данные 140 000 продуктов. Я использую задачу для импорта данных этих продуктов в мое приложение rails.

Мой последний импорт занял чуть менее 10 часов:

rake asi:import_products --trace  26815.23s user 1393.03s system 80% cpu 9:47:34.09 total

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

В идеале, я хотел бы, чтобы я мог обрабатывать каждый узел продукта отдельно и иметь возможность использовать XPATH, размер файла ограничивает нас от использования метода, который требует загрузки всего файла XML в память. Я не могу контролировать формат или размер исходного XML. У меня есть максимум 3 ГБ памяти, которую я могу использовать в процессе.

Есть ли лучший способ, чем этот?

Текущий код задачи Rake:

Фрагмент XML-файла:

1 Ответ

1 голос
/ 18 мая 2010

Можете ли вы сначала извлечь весь файл? Если это так, то я бы предложил разделить файл XML на более мелкие куски (скажем, 512 МБ или около того), чтобы вы могли анализировать одновременные куски одновременно (по одному на ядро), потому что я считаю, что у вас современный ЦП. Что касается недействительного или неправильно сформированного xml - просто добавьте или добавьте отсутствующий XML с помощью простой манипуляции со строками.

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

...