Ускорение создания объектов БД в Ruby с помощью Threads - PullRequest
0 голосов
/ 24 марта 2012

Я работаю с 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 Ответ

2 голосов
/ 25 марта 2012

Несмотря на то, что Ruby 1.9.3 использует собственные потоки для реализации параллелизма, он имеет глобальную блокировку интерпретатора , которая гарантирует, что одновременно выполняется только один поток.

Следовательно, в C Ruby ничего не работает параллельно. Я знаю, что JRuby не налагает внутренней блокировки ни на какой поток, поэтому попробуйте использовать его для запуска своего кода, если это возможно.

В этом ответе Jörg W Mittag более подробно рассматриваются модели потоков нескольких реализаций Ruby. Мне не ясно, подходит ли Рубиниус для этой работы, но я бы попробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...