Tengo algunas dudas sobre cómo ejecutar tareas en paralelo con Perl. Comúnmente realizo lo anterior empleando las herramientas que proporciona el módulo Parallel::ForkManager. Sin embargo, he observado que cuando se crean los procesos hijos hay un consumo excesivo de memoria.
He aquí un ejemplo de la parte de un programa que utilizo para ejecutar subprocesos:
Using perl Syntax Highlighting
- my $fork= new Parallel::ForkManager($ncpus);
- foreach (0..$#proc) {
- $fork->start and next;
- my ($index1, $index2) = split /:/, $proc[$_];
- &grho($core,$total,$index1,$index2,$files[$_],\@vector,\@numbers);
- $fork->finish;
- }
- $fork->wait_all_children;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
En este caso particular la subrutina "grho" genera el archivo "$files[$_]", y calcula una serie de elementos a partir de la información presente en @vector y @numbers. Estos arrays tienen aproximadamente 10^7 elementos.
El programa en cuestión realiza más operaciones (lo anterior es solo una parte), y genera varias estructuras de datos de tamaño considerable (5 GB).
Según entiendo del uso Parallel::ForkManager, cada vez que se ejecuta un proceso hijo se copian todas las variables y la información del proceso padre, lo cual es la causa del uso excesivo de la memoria.
Mi pregunta es: ¿existe alguna otra manera más eficiente de correr subprocesos en perl?