Ruby Parallel / Multithread Programming для чтения огромной базы данных - PullRequest
6 голосов
/ 28 сентября 2011

У меня есть скрипт ruby, который читает огромную таблицу (~ 20 м строк), выполняет некоторую обработку и передает ее в Solr для целей индексации. Это было большим узким местом в нашем процессе. Я планирую ускорить процесс здесь, и я бы хотел достичь некоторого параллелизма. Я смущен многопоточностью Руби. Наши серверы имеют ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]. Из этого сообщения в блоге и этого вопроса в StackOverflow видно, что в Ruby нет "реального" многопоточного подхода. Наши серверы имеют несколько ядер, поэтому использование параллельного гема кажется мне другим подходом.

Какой подход мне выбрать? Кроме того, любые входные данные в параллельных системах чтения базы данных будут высоко оценены.

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Вы можете распараллелить это на уровне ОС. Измените сценарий, чтобы он мог принимать диапазон строк из вашего входного файла

$ reader_script --lines=10000:20000 mytable.txt

Затем выполните несколько экземпляров сценария.

$ reader_script --lines=0:10000 mytable.txt&
$ reader_script --lines=10000:20000 mytable.txt&
$ reader_script --lines=20000:30000 mytable.txt&

Unix автоматически распределяет их по разным ядрам.

1 голос
/ 28 сентября 2011

Есть ли шанс перейти на Ruby 1.9? Обычно быстрее чем 1.8.7.

Это правда, что Ruby страдает от GIL , но если многопоточность решит вашу проблему, вы можете взглянуть на JRuby , так как он поддерживает истинную многопоточность.

Кроме того, вам лучше убедиться, что узким местом является именно центральный процессор, потому что, если это многопоточность ввода / вывода, вы можете не купить много.

...