使用Threads加速Ruby中的DB对象创建

时间:2012-03-24 19:57:12

标签: ruby multithreading

我正在使用6个csv文件,每个文件都包含一个对象的属性。我可以一次一个地阅读它们,但是将每一个分成并行执行的想法非常有吸引力。

我创建了一个数据库对象(不允许关系数据库或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)?这对鲁宾尼斯来说是个好例子吗?

1 个答案:

答案 0 :(得分:2)

尽管Ruby 1.9.3使用本机线程来实现并发,但它有一个global interpreter lock,它确保一次只执行一个线程。

因此,在C Ruby中并没有真正并行运行。我知道JRuby没有对任何线程施加内部锁定,所以尽可能使用它来运行代码。

This answer by Jörg W Mittag更深入地了解了几个Ruby实现的线程模型。我不清楚Rubinius是否适合这份工作,但我会试一试。