2012-03-24 110 views
0

我與6個CSV文件,每個包含一個對象的屬性工作加快DB對象創建的紅寶石。我一次只能閱讀一份,但將每一份文件拆分成一個線程並行執行的想法非常有吸引力。使用線程

我已經創建了一個數據庫對象,其具有用於在每次固定物體的陣列(沒有關係的DB或奧姆斯允許)。我已經嘗試了以下操作來使每個CSV同時打開並初始化,但是已經看到對速度沒有影響。

threads = [] 
    CLASS_FILES.each do |klass, filename| 
    threads << Thread.new do 
     file_to_objects(klass, filename) 
    end 
    end 
    threads.each {|thread| thread.join} 
    update 
end 
def self.load(filename) 
    CSV.open("data/#{filename}", CSV_OPTIONS) 
end 

def self.file_to_objects(klass, filename) 
    file = load(filename) 
    method_name = filename.sub("s.csv","") 
    file.each do |line| 
    instance = klass.new(line.to_hash) 
    Database.instance.send("#{method_name}") << instance 
    end 
end 

我該如何加速紅寶石(MRI 1.9.3)?這對Rubinius來說是個好例子嗎?

回答

2

即使紅寶石1.9.3使用本地線程,以執行併發性,它有一個global interpreter lock這可以確保只有一個線程在執行一段時間。

因此,沒有真正運行在用C Ruby的並行。我知道JRuby對任何線程都沒有內部鎖定,所以儘可能使用它來運行你的代碼。

This answer by Jörg W Mittag有一個更深入的看看幾個Ruby實現的線程模型。我不清楚Rubinius是否適合這項工作,但我會試一試。