2010-05-18 1 views
4

В настоящее время я использую LIBXML :: SAXParser :: Обратные вызовы для анализа большого XML-файла, содержащего данные 140 000 продуктов. Я использую задачу для импорта данных для этих продуктов в мое приложение rails.Анализ очень большого XML-файла с Ruby on Rails (1.4 ГБ). Есть ли лучший способ, чем SAXParser?

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

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

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

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

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

Current Rake Task code:

Snippet of the XML file:

+0

Вам нужно сделать это в Ruby? Может ли C# или Java быть вариантом, который вы готовы рассмотреть? –

+0

Это не нужно анализировать в рубине, однако данные в конечном итоге будут использоваться приложением Rails. Все, что может попасть в мою базу данных, будет достаточно. Кажется, Ruby проще всего конкретизировать эту конкретную проблему. Я бы предпочел не использовать C# на этом, но я открыт для Java, PHP, Python или Perl, если один из них представляет собой очень простое решение. – DBruns

+0

Проверьте расширенный VTD-XML или стандартный vtd-xml, проблема должна быть решена мгновенно. –

ответ

1

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

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

+0

Да, код не очень красивый, но скорость - лишь незначительная проблема. большой проблемой является обработка зависимостей в рамках некоторых ценообразований и критериев XML. Поскольку это просто большой список независимых продуктов, я мог бы разбить файл немного и обработать несколько файлов за раз. Это неплохая идея. – DBruns