2016-04-11 5 views
1

Вот мой Продукты контроллер:Как импортировать 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.

Я читал «[HOW TO] Parse large XML files in Ruby» и, как этот код, но не может получить тот же результат, что и мой код.

Это мой импорт выглядит следующим образом: http://prntscr.com/ar0hn8

Вот мой XML-файл: http://gist.github.com/saroar/0851b55e3c7add4c3deff0b7e306d004

+0

Вместо использования Rails для его импорта вы изучили использование инструментов, которые поставляются с вашим DBM? Это будет намного быстрее. –

+0

Добро пожаловать в переполнение стека. Пожалуйста, прочитайте «[mcve]». Не используйте ссылки на ваш XML. Вместо этого суммируйте его, уменьшив его до минимума, необходимого для демонстрации проблемы. Ссылки rot then break, а затем оставляют ваш вопрос бессмысленным для других в будущем. Мы не знаем, в чем проблема; Сбой вашего кода? Не может ли он импортировать все? Без этой информации нам остается задаться вопросом, как помочь, и любые ответы будут дикими догадками. –

+0

Спасибо за ответ, мой код работает находкой, но когда файл xml большой, у меня нет памяти в моей macbook. У меня есть 8gb rem, но он разбивает мой сервер :(и что такое DBM? – Alif

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^