Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Problema de memoria con forking

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Dom Jul 13, 2008 6:14 am
Zeokat
Perlero Frecuente
Perlero Frecuente
Registrado: 22 Ago 2006
Mensajes: 117
Problema de memoria con forking Responder citando

Bueno tratando de hacerme un sencillo chequeador de URL, escribí el siguiente código.

Perl:
#!/usr/bin/perl -w
use strict;
use LWP::UserAgent;
use HTTP::Request;
use Parallel::ForkManager;

print "Trabajando...\n";
my $archivo_links = $ARGV[0];
chomp($archivo_links);
open LINKS,"$archivo_links" or die "No se encuentra el archivo.... \n";
my @links = <LINKS>;
close(LINKS);

my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");
my $timeout = 30;
my $bots = 5;
my $start = 0;
my $pm = new Parallel::ForkManager($bots);
open CODE, '>>', "links_validos.txt" or die $!;


for (my $i = $start; $i < @links; $i++) {
    $pm->start and next;
    $ua->timeout($timeout);
    my $req = HTTP::Request->new(GET => $links[$i]);
    my $response = $ua->request($req);
    my $content = $response->content();
    if ($content =~ /Bienvenido.../)
         {
            print $links[$i], " Valido!\n";
            print CODE $links[$i],"\n";
         }
    $pm->finish;
}
$pm->wait_all_children;
close(CODE);


Es algo sencillo pero funciona casi a la perfección, tiene un pequeño problema y es que poco a poco se va llenando la memoria de mi sistema hasta que se queda casi parado por completo.

Abrí el administrador de tareas de Windows y vi como a medida que se va bajando el código de los diferentes links se va incrementando la memoria consumida hasta que se queda todo medio parado.

La verdad no sé cómo solucionar esto y tampoco sé dónde está el problema, a ver si alguien me puede echar una mano.

Saludos y gracias de antemano.
Mensaje Dom Jul 13, 2008 9:27 am
Jenda
Perlero Frecuente
Perlero Frecuente
Registrado: 29 Oct 2007
Mensajes: 106
Ubicación: Praga, Republica Checa
Responder citando

Yo creo que sería mejor crear solo los 5 bots y bajar más páginas con cada uno que crear un nuevo bot para cada página. Posiblemente con algo como Thread::Queue (http://search.cpan.org/~jdhedden/Thread-Queue-2.11/lib/Thread/Queue.pm). Y si no quieres usar threads, puedes usar forks (http://search.cpan.org/~rybskej/forks-0.27/lib/forks.pm). Thread::Queue debe funcionar con ambos threads.pm y forks.pm.
Mensaje Dom Jul 13, 2008 10:12 am
Zeokat
Perlero Frecuente
Perlero Frecuente
Registrado: 22 Ago 2006
Mensajes: 117
Responder citando

Uff... no sé... yo es que tomé como ejemplo los códigos de la página del módulo Parallel-ForkManager.

http://search.cpan.org/~dlux/Parallel-ForkManager-0.7.5/ForkManager.pm
Mensaje Dom Jul 13, 2008 12:07 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
Responder citando

Yo creo que el problema es Windows...

Por otra parte, hay un módulo para hacer algo así: HTTP::Client::Parallel.
Mensaje Dom Jul 13, 2008 4:07 pm
Zeokat
Perlero Frecuente
Perlero Frecuente
Registrado: 22 Ago 2006
Mensajes: 117
Responder citando

Muy cierto explorer, probé el mismo código en Xubuntu y había 5 procesos de Perl debido al forking consumiendo 1,3 MB de memoria cada uno.

Menudo cambio... ¡¡¡Maldito Windows!!!

Lo malo es que no entiendo cómo usar el client parallel, no adjuntan ningún ejemplo los de CPAN Sad

Saludos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group