读取大型数据库的Ruby并行/多线程编程
我有一个ruby脚本,读取一个巨大的表(约2000万行),进行一些处理,并将其提供给Solr,以便进行索引。这一直是我们过程中的一大瓶颈。我计划在这里加快速度,我想实现某种并行性。我对Ruby的多线程特性感到困惑。我们的服务器有读取大型数据库的Ruby并行/多线程编程,ruby,multithreading,multicore,Ruby,Multithreading,Multicore,我有一个ruby脚本,读取一个巨大的表(约2000万行),进行一些处理,并将其提供给Solr,以便进行索引。这一直是我们过程中的一大瓶颈。我计划在这里加快速度,我想实现某种并行性。我对Ruby的多线程特性感到困惑。我们的服务器有 ruby 1.8.7(2009-06-12修补级别174)[x86\u 64-linux]。从中可以看出,Ruby没有“真正的”多线程方法。我们的服务器有多个核心,所以对我来说使用似乎是另一种方法 我应该采用什么方法?同时,我们也非常感谢在并行数据库读馈送系统上的任何输
ruby 1.8.7(2009-06-12修补级别174)[x86\u 64-linux]
。从中可以看出,Ruby没有“真正的”多线程方法。我们的服务器有多个核心,所以对我来说使用似乎是另一种方法
我应该采用什么方法?同时,我们也非常感谢在并行数据库读馈送系统上的任何输入。有机会升级到Ruby 1.9吗?它通常比1.8.7快 Ruby确实有一个问题,但如果多线程可以解决您的问题,那么您可以看看,因为它支持真正的线程
另外,您最好确保CPU是瓶颈,因为如果是I/O多线程,可能买不到多少钱。您可以在操作系统级别并行化这一点。更改脚本,使其可以从输入文件中获取一系列行
$ 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将自动将它们分发到不同的内核。如何访问数据库?你能给我们看一些代码吗?我使用mysql gem,使用mysql的limit,offset参数一次获取N(~500)条记录。分批处理并分批将其送入Solr。是否需要更多信息?这似乎是一个合理的方法。我们有8个内核,所以我可以很容易地运行多达8个实例。