В настоящее время я использую 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 ГБ памяти, которую я могу использовать в процессе.
Есть ли лучший способ, чем это?
Вам нужно сделать это в Ruby? Может ли C# или Java быть вариантом, который вы готовы рассмотреть? –
Это не нужно анализировать в рубине, однако данные в конечном итоге будут использоваться приложением Rails. Все, что может попасть в мою базу данных, будет достаточно. Кажется, Ruby проще всего конкретизировать эту конкретную проблему. Я бы предпочел не использовать C# на этом, но я открыт для Java, PHP, Python или Perl, если один из них представляет собой очень простое решение. – DBruns
Проверьте расширенный VTD-XML или стандартный vtd-xml, проблема должна быть решена мгновенно. –