我正在使用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)?这对鲁宾尼斯来说是个好例子吗?
答案 0 :(得分:2)
尽管Ruby 1.9.3使用本机线程来实现并发,但它有一个global interpreter lock,它确保一次只执行一个线程。
因此,在C Ruby中并没有真正并行运行。我知道JRuby没有对任何线程施加内部锁定,所以尽可能使用它来运行代码。
This answer by Jörg W Mittag更深入地了解了几个Ruby实现的线程模型。我不清楚Rubinius是否适合这份工作,但我会试一试。