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

6
我有一个Ruby脚本读取一个巨大的表格(~20m行),进行一些处理并将其馈送到Solr进行索引。这一直是我们流程中的一个大瓶颈。我计划在这里加速事情,并希望实现某种形式的并行性。我对Ruby的多线程特性感到困惑。我们的服务器有ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]。从这篇博客文章StackOverflow上的这个问题可以看出,Ruby没有“真正的”多线程方法。我们的服务器有多个核心,因此使用parallel gem似乎是另一种方法。
我应该采用哪种方法?此外,任何关于并行数据库读取和馈送系统的输入都将受到高度赞赏。

你如何访问数据库?你能展示一些代码吗? - Jonas Elfström
我使用mysql gem通过MySQL的limit和offset参数一次获取N(~500)条记录。将它们分批处理并批量提供给Solr。需要更多信息吗? - pr4n
2个回答

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会自动将它们分配到不同的核心上。

这似乎是一个合理的方法。我们有8个核心,因此我可以非常轻松地运行多达8个实例。 - pr4n

1

有升级到Ruby 1.9的可能吗?通常比1.8.7快。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接