• Publicidad

Threads y IO::Uncompress

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Threads y IO::Uncompress

Notapor bartg01 » 2011-02-20 05:00 @250

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.

Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4



Muchas gracias, espero que alguien pueda ayudarme.
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Publicidad

Re: Threads y IO::Uncompress

Notapor explorer » 2011-02-20 10:38 @484

¿No será que el módulo IO::Uncompress::Bunzip2 no funciona con threads?

¿Qué error sale?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Threads y IO::Uncompress

Notapor bartg01 » 2011-02-20 10:55 @496

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 ;-).

Sintáxis: [ Descargar ] [ Ocultar ]
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
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Re: Threads y IO::Uncompress

Notapor explorer » 2011-02-20 14:13 @634

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Threads y IO::Uncompress

Notapor bartg01 » 2011-02-21 07:15 @344

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.
bartg01
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-11-29 16:15 @718

Re: Threads y IO::Uncompress

Notapor wanako » 2011-02-28 14:04 @627

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. export MALLOC_CHECK_=0
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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.
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados