2012-03-24 9 views
0

それぞれのオブジェクトの属性を含む6つのcsvファイルを扱っています。一度に1つずつ読むことができますが、スレッドごとに分割して並行して実行するという考えは非常に魅力的です。スレッドを使用してRubyでDBオブジェクトの作成を高速化する

保持しているオブジェクトごとに配列を持つデータベースオブジェクト(リレーショナルデータベースまたはORMは使用できません)を作成しました。私は各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

Ruby 1.9.3では、並行処理を実装するためにネイティブスレッドを使用していますが、global interpreter lockがあり、一度に1つのスレッドしか実行されません。

したがって、C Rubyでは実際には何も並行して実行されません。私は、JRubyがどのスレッドにも内部ロックを課さないことを知っています。可能であれば、コードを使用して実行してみてください。

This answer by Jörg W Mittagは、いくつかのRuby実装のスレッドモデルをより詳しく見ています。 Rubiniusが仕事に合っているかどうかは私には分かりませんが、試してみてください。

関連する問題