Как импортировать 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

Другие вопросы по тегам