2011-09-28 11 views
6

Tengo un script de ruby ​​leyendo una tabla enorme (~ 20m filas), haciendo un poco de procesamiento y llevándolo a Solr para fines de indexación. Esto ha sido un gran cuello de botella en nuestro proceso. Estoy planeando acelerar las cosas aquí y me gustaría lograr algún tipo de paralelismo. Estoy confundido acerca de la naturaleza multithreading de Ruby. Nuestros servidores tienen ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]. Desde this blog post y this question at StackOverflow, es visible que Ruby no tiene un enfoque de enhebrado múltiple "real". Nuestros servidores tienen múltiples núcleos, por lo que usar parallel gem parece ser otro enfoque para mí.Programación de Ruby Parallel/Multithread para leer la gran base de datos

¿Qué enfoque debo seguir? Además, cualquier entrada en sistemas paralelos de lectura de bases de datos sería muy apreciada.

+0

¿Cómo se accede a la base de datos? ¿Puedes mostrarnos algún código? –

+0

Utilizo mysql gem para obtener N (~ 500) registros a la vez utilizando el límite de MySQL, los parámetros de compensación. Procesar por lotes y alimentarlos por lotes a Solr. ¿Se necesita más información? –

Respuesta

1

¿Alguna posibilidad de actualizar a Ruby 1.9? Por lo general, es más rápido que 1.8.7.

Es cierto que Ruby sufre de tener un GIL, pero si el multihebra resolvería su problema, entonces puede echarle un vistazo a JRuby ya que admite el enhebrado verdadero.

También es mejor que se asegure de que la CPU sea el cuello de botella, porque si es multitarea de E/S puede que no le compre mucho.

4

Puede paralelizar esto en el nivel del sistema operativo. Cambiar la secuencia de comandos para que se pueda adoptar una serie de líneas de su archivo de entrada

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

A continuación, ejecute varias instancias de la secuencia de comandos.

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

Unix los distribuirá a diferentes núcleos automáticamente.

+0

Esto parece un enfoque razonable. Tenemos 8 núcleos, por lo que puedo ejecutar hasta 8 instancias con mucha facilidad. –

+0

¿Alguna documentación sobre 'reader_script'? No puedo encontrar ninguno. – Chamnap

Cuestiones relacionadas