Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Avanzado » Threads y IO::Uncompress Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota 2011-02-20 05:00 @250

Perlero Nuevo
Registrado: 2007-11-29 16:15 @718
Mensajes: 23
Threads y IO::Uncompress
Hola a todos,

Llevo unos días intentando manipular un fichero comprimido muy grande (hablamos de unos cuantos gigas). Así que pensé en usar threads para procesarlo y mantenerlo en un formato comprimido, en este caso bzip2. El problema es que no puedo cargar todo el fichero en memoria para manipularlo, así que escribí un script de tal forma que el hilo principal vaya cargando paquetes de líneas según vayan terminando los hilos que hacen el trabajo "duro". Si el archivo no está comprimido no hay ningún problema funciona bien, pero cuando intento usar el paquete IO::Uncompress::bzip2, tras la primera vuelta, da un error rarísimo. ¿Podría alguien echarme una mano? Mando un ejemplo del código, en este caso el trabajo es sólo imprimir en pantalla pero falla igual.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!perl -w
  2.  
  3. use strict;
  4. use IO::Uncompress::Bunzip2;
  5. use threads;
  6.  
  7. my $numLines=10;
  8. my $numThreads=2;
  9.  
  10. foreach (glob "/shared/Methylation_rawData/prueba/aerial_bz2/*.bz2") {
  11. my $z = new IO::Uncompress::Bunzip2 $_;
  12. my @threads;
  13. my @lines;
  14. until (eof($z)) {
  15.  for (my $i=0;$i<$numThreads;$i++) {
  16.   if (!$threads[$i] and !eof($z)) {
  17.    $lines[$i]=&chargeLines($numLines,$z,$lines[$i]);
  18.    $threads[$i]=threads->create(\&worker,$lines[$i]);
  19.    undef $lines[$i];
  20.   }
  21.   elsif ($threads[$i]->is_joinable() and !eof($z)) {
  22.    $threads[$i]->join();
  23.    if (defined $lines[$i]) {
  24.     $threads[$i]=threads->create(\&worker,$lines[$i]);
  25.     undef $lines[$i];
  26.    }
  27.    else {
  28.     $lines[$i]=&chargeLines($numLines,$z,$lines[$i]);
  29.     $threads[$i]=threads->create(\&worker,$lines[$i]);
  30.     undef $lines[$i];
  31.    }
  32.   }
  33.   elsif ($threads[$i]->is_running() and !eof($z)) {
  34.    if (defined $lines[$i]) {}
  35.    else {$lines[$i]=&chargeLines($numLines,$z,$lines[$i]);}
  36.   }
  37.   else {}
  38.   last if eof($z);
  39. }
  40. }
  41. for (my $i=0;$i<$numThreads;$i++) {
  42.    if (defined $lines[$i]) {
  43.     if ($threads[$i]->is_joinable() or $threads[$i]->is_running()) {
  44.      $threads[$i]->join();
  45.      if (defined $lines[$i]) {
  46.       $threads[$i]=threads->create(\&worker,$lines[$i]);
  47.       undef $lines[$i];
  48.      }
  49.      else {}
  50.    }
  51.    else {}
  52.    }
  53.    else {}
  54. }
  55. if (threads->list()>0) {
  56.   foreach (threads->list){$_->join;}
  57. }
  58. else {}
  59. }
  60.  
  61. sub worker{
  62.         print "@{$_[0]}";
  63. }
  64.  
  65. sub chargeLines {
  66.         my $F=$_[1];
  67.         while (my $line=<$F>) {
  68.                 push(@{$_[2]},$line);
  69.                 for (my $j=2;$j<=$_[0];$j++) {
  70.                         if ($line=<$F>) {
  71.                                 push(@{$_[2]},$line);
  72.                         }
  73.                         else {last;}
  74.                 }
  75.                 last;
  76.         }
  77.         return($_[2]);
  78. }



Muchas gracias, espero que alguien pueda ayudarme.


Nota 2011-02-20 10:38 @484
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Threads y IO::Uncompress
¿No será que el módulo IO::Uncompress::Bunzip2 no funciona con threads?

¿Qué error sale?

_________________
JF^D Perl programming


Nota 2011-02-20 10:55 @496

Perlero Nuevo
Registrado: 2007-11-29 16:15 @718
Mensajes: 23
Re: Threads y IO::Uncompress
El script funciona para la primera vuelta, es decir, carga y printea en pantalla la carga de los primeros X threads. Cuando vuelve a cargar es cuando falla. Te pego el error, aunque para mi es como si fuera chino ;-).

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
*** glibc detected *** perl: double free or corruption (!prev): 0x0000000002150b50 ***
======= Backtrace: =========
/lib/libc.so.6[0x7fbfdae13dd6]
/lib/libc.so.6(cfree+0x6c)[0x7fbfdae1874c]
/usr/lib/perl5/auto/Compress/Raw/Bzip2/Bzip2.so(XS_Compress__Raw__Bunzip2_DESTROY+0x11c)[0x7fbfda14398c]
/usr/lib/libperl.so.5.10(Perl_pp_entersub+0x53f)[0x7fbfdb85bc0f]
/usr/lib/libperl.so.5.10(Perl_call_sv+0x592)[0x7fbfdb857b02]
/usr/lib/libperl.so.5.10(Perl_sv_clear+0xb6)[0x7fbfdb86e2c6]
/usr/lib/libperl.so.5.10(Perl_sv_free2+0x52)[0x7fbfdb86ea82]
/usr/lib/libperl.so.5.10(Perl_sv_clear+0x45c)[0x7fbfdb86e66c]
/usr/lib/libperl.so.5.10(Perl_sv_free2+0x52)[0x7fbfdb86ea82]
/usr/lib/libperl.so.5.10(Perl_hv_free_ent+0x42)[0x7fbfdb84c012]
/usr/lib/libperl.so.5.10[0x7fbfdb84d2b1]
/usr/lib/libperl.so.5.10(Perl_hv_undef+0x152)[0x7fbfdb84f122]
/usr/lib/libperl.so.5.10(Perl_sv_clear+0x596)[0x7fbfdb86e7a6]
/usr/lib/libperl.so.5.10(Perl_sv_free2+0x52)[0x7fbfdb86ea82]
/usr/lib/libperl.so.5.10(Perl_sv_clear+0x45c)[0x7fbfdb86e66c]
/usr/lib/libperl.so.5.10(Perl_sv_free2+0x52)[0x7fbfdb86ea82]
/usr/lib/libperl.so.5.10(Perl_hv_free_ent+0x42)[0x7fbfdb84c012]
/usr/lib/libperl.so.5.10[0x7fbfdb84d2b1]
/usr/lib/libperl.so.5.10(Perl_hv_undef+0x152)[0x7fbfdb84f122]
/usr/lib/libperl.so.5.10(Perl_sv_clear+0x596)[0x7fbfdb86e7a6]
/usr/lib/libperl.so.5.10(Perl_sv_free2+0x52)[0x7fbfdb86ea82]
/usr/lib/libperl.so.5.10(Perl_gp_free+0x1a0)[0x7fbfdb7ea0a0]
/usr/lib/libperl.so.5.10(Perl_sv_clear+0x6dd)[0x7fbfdb86e8ed]
/usr/lib/libperl.so.5.10(Perl_sv_free2+0x52)[0x7fbfdb86ea82]
/usr/lib/libperl.so.5.10[0x7fbfdb8639a2]
/usr/lib/libperl.so.5.10(Perl_sv_clean_objs+0x21)[0x7fbfdb863a01]
/usr/lib/libperl.so.5.10(perl_destruct+0x1229)[0x7fbfdb859cc9]
/usr/lib/perl/5.10/auto/threads/threads.so[0x7fbfd9d2781b]
/usr/lib/perl/5.10/auto/threads/threads.so(XS_threads_join+0x2eb)[0x7fbfd9d2810b]
/usr/lib/libperl.so.5.10(Perl_pp_entersub+0x53f)[0x7fbfdb85bc0f]
/usr/lib/libperl.so.5.10(Perl_runops_standard+0x16)[0x7fbfdb859f86]
/usr/lib/libperl.so.5.10(perl_run+0x33c)[0x7fbfdb85844c]
perl(main+0xec)[0x400d7c]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7fbfdadbcabd]
perl[0x400bc9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fc:00 131354                             /usr/bin/perl
00601000-00602000 r--p 00001000 fc:00 131354                             /usr/bin/perl
00602000-00603000 rw-p 00002000 fc:00 131354                             /usr/bin/perl
01e51000-027ea000 rw-p 00000000 00:00 0                                  [heap]
7fbfd37ff000-7fbfd3800000 ---p 00000000 00:00 0
7fbfd3800000-7fbfd4000000 rw-p 00000000 00:00 0
7fbfd4000000-7fbfd4445000 rw-p 00000000 00:00 0
7fbfd4445000-7fbfd8000000 ---p 00000000 00:00 0
7fbfd81b0000-7fbfd81b1000 ---p 00000000 00:00 0
7fbfd81b1000-7fbfd89b1000 rw-p 00000000 00:00 0
7fbfd89b1000-7fbfd89b2000 ---p 00000000 00:00 0
7fbfd89b2000-7fbfd91b2000 rw-p 00000000 00:00 0
7fbfd91b2000-7fbfd91b3000 ---p 00000000 00:00 0
7fbfd91b3000-7fbfd99b3000 rw-p 00000000 00:00 0
7fbfd9b0b000-7fbfd9b21000 r-xp 00000000 fc:00 40                         /lib/libgcc_s.so.1
7fbfd9b21000-7fbfd9d20000 ---p 00016000 fc:00 40                         /lib/libgcc_s.so.1
7fbfd9d20000-7fbfd9d21000 r--p 00015000 fc:00 40                         /lib/libgcc_s.so.1
7fbfd9d21000-7fbfd9d22000 rw-p 00016000 fc:00 40                         /lib/libgcc_s.so.1
7fbfd9d22000-7fbfd9d2d000 r-xp 00000000 fc:00 2752520                    /usr/lib/perl/5.10.0/auto/threads/threads.so
7fbfd9d2d000-7fbfd9f2c000 ---p 0000b000 fc:00 2752520                    /usr/lib/perl/5.10.0/auto/threads/threads.so
7fbfd9f2c000-7fbfd9f2d000 r--p 0000a000 fc:00 2752520                    /usr/lib/perl/5.10.0/auto/threads/threads.so
7fbfd9f2d000-7fbfd9f2e000 rw-p 0000b000 fc:00 2752520                    /usr/lib/perl/5.10.0/auto/threads/threads.so
7fbfd9f2e000-7fbfd9f3d000 r-xp 00000000 fc:00 309                        /lib/libbz2.so.1.0.4
7fbfd9f3d000-7fbfda13d000 ---p 0000f000 fc:00 309                        /lib/libbz2.so.1.0.4
7fbfda13d000-7fbfda13e000 r--p 0000f000 fc:00 309                        /lib/libbz2.so.1.0.4
7fbfda13e000-7fbfda13f000 rw-p 00010000 fc:00 309                        /lib/libbz2.so.1.0.4
7fbfda13f000-7fbfda149000 r-xp 00000000 fc:00 2884380                    /usr/lib/perl5/auto/Compress/Raw/Bzip2/Bzip2.so
7fbfda149000-7fbfda349000 ---p 0000a000 fc:00 2884380                    /usr/lib/perl5/auto/Compress/Raw/Bzip2/Bzip2.so
7fbfda349000-7fbfda34a000 r--p 0000a000 fc:00 2884380                    /usr/lib/perl5/auto/Compress/Raw/Bzip2/Bzip2.so
7fbfda34a000-7fbfda34b000 rw-p 0000b000 fc:00 2884380                    /usr/lib/perl5/auto/Compress/Raw/Bzip2/Bzip2.so
7fbfda34b000-7fbfda34e000 r-xp 00000000 fc:00 1441838                    /usr/lib/perl/5.10.0/auto/Fcntl/Fcntl.so
7fbfda34e000-7fbfda54e000 ---p 00003000 fc:00 1441838                    /usr/lib/perl/5.10.0/auto/Fcntl/Fcntl.so
7fbfda54e000-7fbfda54f000 r--p 00003000 fc:00 1441838                    /usr/lib/perl/5.10.0/auto/Fcntl/Fcntl.so
7fbfda54f000-7fbfda550000 rw-p 00004000 fc:00 1441838                    /usr/lib/perl/5.10.0/auto/Fcntl/Fcntl.so
7fbfda550000-7fbfda555000 r-xp 00000000 fc:00 1572866                    /usr/lib/perl/5.10.0/auto/IO/IO.so
7fbfda555000-7fbfda754000 ---p 00005000 fc:00 1572866                    /usr/lib/perl/5.10.0/auto/IO/IO.so
7fbfda754000-7fbfda755000 r--p 00004000 fc:00 1572866                    /usr/lib/perl/5.10.0/auto/IO/IO.so
7fbfda755000-7fbfda756000 rw-p 00005000 fc:00 1572866                    /usr/lib/perl/5.10.0/auto/IO/IO.so
7fbfda756000-7fbfda75b000 r-xp 00000000 fc:00 1441839                    /usr/lib/perl/5.10.0/auto/File/Glob/Glob.so
7fbfda75b000-7fbfda95a000 ---p 00005000 fc:00 1441839                    /usr/lib/perl/5.10.0/auto/File/Glob/Glob.so
7fbfda95a000-7fbfda95b000 r--p 00004000 fc:00 1441839                    /usr/lib/perl/5.10.0/auto/File/Glob/Glob.so
7fbfda95b000-7fbfda95c000 rw-p 00005000 fc:00 1441839                    /usr/lib/perl/5.10.0/auto/File/Glob/Glob.so
7fbfda95c000-7fbfda964000 r-xp 00000000 fc:00 1572867                    /usr/lib/perl/5.10.0/auto/List/Util/Util.so
7fbfda964000-7fbfdab63000 ---p 00008000 fc:00 1572867                    /usr/lib/perl/5.10.0/auto/List/Util/Util.so
7fbfdab63000-7fbfdab64000 r--p 00007000 fc:00 1572867                    /usr/lib/perl/5.10.0/auto/List/Util/Util.so
7fbfdab64000-7fbfdab65000 rw-p 00008000 fc:00 1572867                    /usr/lib/perl/5.10.0/auto/List/Util/Util.so
7fbfdab65000-7fbfdab6e000 r-xp 00000000 fc:00 140                        /lib/libcrypt-2.10.1.so
7fbfdab6e000-7fbfdad6e000 ---p 00009000 fc:00 140                        /lib/libcrypt-2.10.1.so
7fbfdad6e000-7fbfdad6f000 r--p 00009000 fc:00 140                        /lib/libcrypt-2.10.1.so
7fbfdad6f000-7fbfdad70000 rw-p 0000a000 fc:00 140                        /lib/libcrypt-2.10.1.so
7fbfdad70000-7fbfdad9e000 rw-p 00000000 00:00 0
7fbfdad9e000-7fbfdaf04000 r-xp 00000000 fc:00 138                        /lib/libc-2.10.1.soAborted


Nota 2011-02-20 14:13 @634
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Threads y IO::Uncompress
Por las primeras líneas, deduzco que sí, que lo que ha provocado el cuelgue es el módulo de descompresión.

No soy experto en hebras, pero en el mundillo Perl se dice que es mejor no jugar mucho con ellas, existiendo otras alternativas como Coro y fork().

No he mirado mucho el código, pero si dices que la diferencia entre que funcione o no es justamente la utilización del módulo, pues el problema está ahí, naturalmente.

Te aconsejo que, si no obtienes respuesta aquí, mandes un correo al autor o pongas un tique de error sobre este módulo, en la página correspondiente.

Un cambio que sí que veo en el código, es que hay que poner el "use threads;" justo después del "use strict;". Vamos, ha de ser el primer módulo a cargar.

_________________
JF^D Perl programming


Nota 2011-02-21 07:15 @344

Perlero Nuevo
Registrado: 2007-11-29 16:15 @718
Mensajes: 23
Re: Threads y IO::Uncompress
He probado también con Coro y nada, he cambiado el paquete de descompresión por PerlIO::via::Bzip2 (pero debe llamar al mismo módulo) y tampoco. No sé qué más hacer, a ver si alguien sabe algo.

Un saludo y gracias.


Nota 2011-02-28 14:04 @627

Perlero Nuevo
Registrado: 2010-09-23 11:27 @519
Mensajes: 27
Re: Threads y IO::Uncompress
No puedo reproducir el error, pero he leído en la güeb y en el Manual de GLibC la opción de establecer la variable de entorno 'MALLOC_CHECK_'.

Prueba con:
Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
  1. export MALLOC_CHECK_=0

Antes de lanzar el script, si funciona depende de cómo se han compilado las glibc y es probable que ralentice el proceso, no arreglas el error pero no debería terminar tu programa con el error fatal.


Responder al tema  [ 6 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO