"formail" en Perl

Aldrin Martoq amartoq en dcc.uchile.cl
Mar Jul 28 19:03:41 CLT 2009


2009/7/28 Alvaro Herrera <alvherre en alvh.no-ip.org>:
> Estoy trabajando en construir un sistema _bueno_ de archivos web de
> listas de correo, para reemplazar el sistema de archivos de PostgreSQL.
[...]
> Hasta ahora me ha ido bastante bien; tengo un programa en Perl el cual,
> dado un mail, extrae los datos interesantes con MIME::Parser y los metes
> en una base de datos para posterior despliegue.
> El problema más serio que estoy enfrentando es de rendimiento del
> proceso de importar los mails que están en formato mbox.  Actualmente
> estoy usando "formail -s mi-programa", pero el problema es que esto hace
> un fork invocando mi programa en Perl _para cada mail_, lo cual como
> comprenderán es horriblemente lento.

Si formail funciona tan bien, pa' que reescribir la rueda. Dos soluciones:

1. Dividir los MBOX en N archivos, y despues procesarlos. Ejemplos:
$ formail -s ./guardar.sh < MBOX

--- ini guardar.sh ---
#!/bin/sh
F=$(ls | wc)
echo $F
cat > $F
--- fin guardar.sh --

Y despues procesas los archivos con numeritos. El problema es que
necesitas el doble de espacio, y puede ser algo lento ya que necesitas
2 pasadas...



2. En vez de guardar, enviar el "trabajo" a un perl que ya esté
arriba... desconozco si hay algun framework decente para Linux (algo
como Grand Central Dispatch que vendrá en Leopard)... así que por
mientras la solución de los pobres:

$ formail -s nc -q 1 127.0.0.1 8765 < MBOX

--- ini servidor.pl ---
#!/usr/bin/perl -w -T
package Prueba;

use base qw(Net::Server);

sub process_request {
        my $count = 0;
        while (<STDIN>) {
                $count++;
                # INI SU CODIGO AQUI ...
                # ... FIN SU CODIGO AQUI
        }
        print "$count lineas procesadas\n";
        sleep(1);
}

Prueba->run(port => 8765);
--- fin servidor.pl ---

Tienes que reemplazar SU CODIGO AQUI por el codigo que ya tienes,
segun entiendo.

formail extrae un correo, netcat se lo pasa al servidor y tu servidor
TCP lo procesa. Puedes mejorar el proceso si tienes mas de una
cpu/core con -n # cores...

$ formail -n 4 -s nc -q 1 127.0.0.1 8765 < MBOX


BTW, estamos MUY atrasados con programación multicore, si alguien hace
un equivalente en GCD bienvenido sea ;)


-- 
Aldrin Martoq
http://aldrin.martoq.cl/



Más información sobre la lista de distribución Linux