Как импортировать 20 тысяч товаров из большого XML-файла в приложении Rails
Вот мой контроллер продуктов:
def import
if params[:xml_file]
file = params[:xml_file]
doc = Nokogiri::XML::Document.parse(file)
total_product = doc.xpath('//offer').take(params[:limit_number].to_i).length
Product.import(doc, params[:category_id], params[:stranger_category], params[:limit_number])
redirect_to products_path, notice: "#{total_product} Product added."
end
end
Вот мой код модели продукта:
def self.import(doc, category, cat_id, lit_num)
parsed_products = doc.xpath('//offer').take(lit_num.to_i)
parsed_products.each do |product|
next unless product.at_xpath('categoryId').text == cat_id
Product.create!(
price: product.at_xpath('price').text,
category_id: product.at_xpath('categoryId').text.gsub(cat_id, category),
remote_image_url: product.at_xpath('picture').text.strip,
brand_id: product.at_xpath('vendor').text,
title: product.at_xpath('name').text,
description: product.at_xpath('description').text
)
end
end
Это моя форма загрузки:
h2.text-center Import Products
= form_tag import_products_path, multipart: true do |f|
= file_field_tag :xml_file
br
= label_tag 'Mine Category'
= select_tag :category_id, options_for_select(Category.all.map {|c| [c.name, c.id ] })
br
= label_tag 'Stranger Category: '
= text_field_tag 'stranger_category'
br
= label_tag 'Limit: '
= text_field_tag "limit_number"
br
br
= submit_tag "Import"
Этот код работает для небольших файлов, но не для моего XML.
Я читал " [КАК] проанализировать большие XML-файлы в Ruby" и мне понравился этот код, но я не смог получить тот же результат, что и мой код.
Это мой импорт выглядит так: http://prntscr.com/ar0hn8
Вот мой XML-файл: http://gist.github.com/saroar/0851b55e3c7add4c3deff0b7e306d004
1 ответ
Nokogiri::XML
пытается загрузить весь файл в память, которая не будет работать с большими входными файлами.
Если вы хотите продолжить загрузку этого файла в Rails, можно использовать синтаксический анализатор SAX ( http://www.rubydoc.info/github/sparklemotion/nokogiri/master/Nokogiri/XML/SAX), который анализирует файл XML. построчно, а не все сразу.
Или вы можете посмотреть на инструменты, которые предоставляет ваша база данных, как подсказывал @the-tin-man. MySQL имеет инструмент для прямой загрузки XML: https://dev.mysql.com/doc/refman/5.5/en/load-xml.html