Ruby并行/多线程编程读取庞大的数据库

时间:2011-09-28 07:01:21

标签: ruby multithreading multicore

我有一个ruby脚本读取一个巨大的表(约20米行),进行一些处理并将其馈送到Solr以进行索引。这是我们流程中的一大瓶颈。我打算在这里加快速度,我想实现某种并行性。我对Ruby的多线程性质感到困惑。我们的服务器有 ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]。从this blog postthis question at StackOverflow可以看出Ruby没有“真正的”多线程方法。我们的服务器有多个核心,因此使用parallel gem似乎是另一种方法。

我应该采用什么方法?此外,对并行数据库读取系统的任何输入都将受到高度赞赏。

2 个答案:

答案 0 :(得分:4)

您可以在操作系统级别对此进行并行化。更改脚本,以便它可以从输入文件中获取一系列行

$ 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 :(得分:1)

是否有机会升级到Ruby 1.9?它通常比1.8.7快。

Ruby确实存在GIL,但如果多线程可以解决您的问题,那么您可以查看JRuby,因为它支持真正的线程。

另外,你最好确保它是CPU的瓶颈,因为如果它的I / O多线程可能不会给你带来太大的好处。