Я уже месяц работаю с Nokogiri, REXML & Ruby. У меня есть гигантская база данных, которую я пытаюсь сканировать. Вещи, которые я очищаю, это HTML-ссылки и XML-файлы.
Есть ровно 43612 файлов XML, которые я хочу сканировать и хранить в файле CSV.
Мой сценарий работает, если сканировать, может быть, 500 XML-файлов, но больше, что занимает слишком много времени и он зависает или что-то в этом роде.
Я разделил код на части, чтобы его было легко прочитать, весь сценарий / код здесь: https://gist.github.com/1981074
Я использую две библиотеки, потому что я не смог найти способ сделать все это в нокогири. Лично мне REXML проще в использовании.
Мой вопрос: как это можно исправить, чтобы мне не пришлось ползти всю неделю? Как мне заставить его работать быстрее?
ЗДЕСЬ МОЙ СКРИПТ:
Требуется необходимая библиотека:
require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'rexml/document'
require 'csv'
include REXML
Создать массив массивов для хранения данных:
@urls = Array.new
@ID = Array.new
@titleSv = Array.new
@titleEn = Array.new
@identifier = Array.new
@typeOfLevel = Array.new
Получите все xml-ссылки со спецификационного сайта и сохраните их в массиве с именем @ urls
htmldoc = Nokogiri::HTML(open('http://testnavet.skolverket.se/SusaNavExport/EmilExporter?GetEvent&EMILVersion=1.1&NotExpired&EEFormOfStudy=normal&EIAcademicType=UoH&SelectEI'))
htmldoc.xpath('//a/@href').each do |links|
@urls << links.content
end
Цикл перебрасывает массив @urls и захватывает каждый элементный узел, который я хочу получить с помощью xpath.
@urls.each do |url|
# Loop throw the XML files and grab element nodes
xmldoc = REXML::Document.new(open(url).read)
# Root element
root = xmldoc.root
# Hämtar info-id
@ID << root.attributes["id"]
# TitleSv
xmldoc.elements.each("/educationInfo/titles/title[1] | /ns:educationInfo/ns:titles/ns:title[1]"){
|e| m = e.text
m = m.to_s
next if m.empty?
@titleSv << m
}
Затем сохраните их в файле CSV.
CSV.open("eduction_normal.csv", "wb") do |row|
(0..@ID.length - 1).each do |index|
row << [@ID[index], @titleSv[index], @titleEn[index], @identifier[index], @typeOfLevel[index], @typeOfResponsibleBody[index], @courseTyp[index], @credits[index], @degree[index], @preAcademic[index], @subjectCodeVhs[index], @descriptionSv[index], @lastedited[index], @expires[index]]
end
end