2012-02-25 74 views
-1

我有收集46344個xml鏈接的這個ruby腳本,然後在每個xml文件中收集16個元素節點。該過程的最後一部分是它將其存儲在一個CSV文件中。我的問題是需要很長時間。它需要超過1-2小時..如何讓我的rexml/nokogiri腳本運行得更快

這是沒有鏈接的腳本,所有的XML鏈接,我不能提供鏈接beacuse其公司的東西..我希望它很酷。

這裏是腳本,它的工作原理,但它需要長期:

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 
@typeOfResponsibleBody = Array.new 
@courseTyp = Array.new 
@credits = Array.new 
@degree = Array.new 
@preAcademic = Array.new 
@subjectCodeVhs = Array.new 
@descriptionSv = Array.new 
@visibleToSweApplicants = Array.new 
@lastedited = Array.new 
@expires = Array.new 

# Hämtar alla XML-länkar 
htmldoc = Nokogiri::HTML(open('A SITE THAT HAVE ALL THE LINKS')) 
# Hämtar alla länkar för xml-filerna och sparar dom i arrayn urls 
htmldoc.xpath('//a/@href').each do |links| 
    @urls << links.content 
end 

@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("/ns:educationInfo/ns:titles/ns:title[1]"){ 
    |e| @titleSv << e.text 
    } 
    # TitleEn 
    xmldoc.elements.each("/ns:educationInfo/ns:titles/ns:title[2]"){ 
    |e| @titleEn << e.text 
    } 
    # Identifier 
    xmldoc.elements.each("/ns:educationInfo/ns:identifier"){ 
    |e| @identifier << e.text 
    } 
    # typeOfLevel 
    xmldoc.elements.each("/ns:educationInfo/ns:educationLevelDetails/ns:typeOfLevel"){ 
    |e| @typeOfLevel << e.text 
    } 
    # typeOfResponsibleBody 
    xmldoc.elements.each("/ns:educationInfo/ns:educationLevelDetails/ns:typeOfResponsibleBody"){ 
    |e| @typeOfResponsibleBody << e.text 
    } 
    # courseTyp 
    xmldoc.elements.each("/ns:educationInfo/ns:educationLevelDetails/ns:academic/ns:courseOfferingPackage/ns:type"){ 
    |e| @courseTyp << e.text 
    } 
    # credits 
    xmldoc.elements.each("/ns:educationInfo/ns:credits/ns:exact"){ 
    |e| @credits << e.text 
    } 
    # degree 
    xmldoc.elements.each("/ns:educationInfo/ns:degrees/ns:degree"){ 
    |e| @degree << e.text 
    } 
    # @preAcademic 
    xmldoc.elements.each("/ns:educationInfo/ns:prerequisites/ns:academic"){ 
    |e| @preAcademic << e.text 
    } 
    # @subjectCodeVhs 
    xmldoc.elements.each("/ns:educationInfo/ns:subjects/ns:subject/ns:code"){ 
    |e| @subjectCodeVhs << e.text 
    } 
    # DescriptionSv 
    xmldoc.elements.each("/educationInfo/descriptions/ct:description/ct:text"){ 
    |e| @descriptionSv << e.text 
    } 
    # Hämtar dokuments utgångs-datum 
    @expires << root.attributes["expires"] 
    # Hämtar dokuments lastedited 
    @lastedited << root.attributes["lastEdited"] 

    # Lagrar dom i uni.CSV 
    CSV.open("eduction_normal.csv", "wb") do |row| 
    ([email protected] - 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 
end 
+1

我開始做一些分析(紅寶石prof)等,看看瓶頸是什麼:是XML解析,網絡帶寬下載文件解析時,等 – 2012-02-25 23:20:49

+0

甜,我會檢查出來。 – SHUMAcupcake 2012-02-25 23:23:15

+1

I second @ FrederickCheung的評論。我會補充說,它可能與網絡訪問有關,而不是實際的解析。 – 2012-02-25 23:33:03

回答

1

如果它是網絡訪問,你可以啓動線程,並/或開始使用JRuby可以使用所有內核的處理器。如果你經常這樣做,你將不得不制定一個讀寫策略,在沒有阻塞的情況下爲你提供最好的服務。

+0

我正在檢查出來的夥計,你能提供我的代碼som例子嗎? =)歡呼 – SHUMAcupcake 2012-02-26 20:14:04

+0

不,我沒有任何當前的代碼示例,對不起。我會在10個左右的步驟中遍歷這些網址,然後讓每個網址在一個線程中運行。也讓它寫。但是,嘿,試着在線索上找到一些文檔。我真的不知道我是怎麼把它關掉的。 – three 2012-02-26 21:51:43