• Publicidad

Problema de memoria con forking

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema de memoria con forking

Notapor Zeokat » 2008-07-13 07:14 @343

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor Jenda » 2008-07-13 10:27 @477

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.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor Zeokat » 2008-07-13 11:12 @508

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-F ... Manager.pm
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor explorer » 2008-07-13 13:07 @588

Yo creo que el problema es Windows...

Por otra parte, hay un módulo para hacer algo así: HTTP::Client::Parallel.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2008-07-13 17:07 @755

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 :(

Saludos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron