• Publicidad

Error 'out of memory'

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

Error 'out of memory'

Notapor judith garcia garcia » 2007-09-20 11:38 @526

Buenas días.

Solicito ayuda con un caso que se me esta presentando en un programa Perl que corre bajo Unix.

Tengo un arreglo @RECORDINVOICE que posee 1000 registros y cuando está ejecutando la siguiente instrucción me muestra el mensaje 'out of memory':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach $J (sort  {$a <=> $b} keys %{$RECORDINVOICE[$i]}) {
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


la porción de código donde está este comando es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 for ($i = 1; $i <=$NUMINVOICES ; $i++) {
            foreach $J (sort  {$a <=> $b} keys %{$RECORDINVOICE[$i]}) {
                push @{$rINVOICETMP}, $RECORDINVOICE[$i]{$J};
            }
  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


También me muestra el mismo mensaje cuando está ejecutando la siguiente opción:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
push  @{$rINVOICETMP}, @RECORDINVOICE;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


para estos arreglos utilicé
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ArcTmp=$ARGV[2]."\/temporal$NUMDOCUMENTOS\.tmp";
$DBRECORDINVOICE = tie @RECORDINVOICE, "DB_File", $ArcTmp, O_CREAT|O_RDWR, 0644, $DB_RECNO;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



En @{$rINVOICETMP} recibe como parámetro @INVOICETMP para el cual se utilizó

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ArcTmp=$ARGV[2]."\/factura$NUMDOCUMENTOS\.tmp";
$DBINVOICETMP = tie @INVOICETMP, "DB_File", $ArcTmp, O_CREAT|O_RDWR, 0644, $DB_RECNO;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Le agradezco de antemano cualquier sugerencia que me pueda ayudar pues es algo urgente que debo solucionar.


Mil gracias


Judith García
judith garcia garcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-09-20 11:30 @521

Publicidad

Notapor explorer » 2007-09-20 12:01 @542

Bienvenida los foros de Perl en Español, Judith.

¿Qué sistema operativo es? ¿Cuánta memoria física tienes?
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 judith garcia garcia » 2007-09-20 13:07 @588

El sistema operativo es hpux11, la máquina tiene 64 gigas de RAM. No sé cuánta memoria le asigna al usuario conque corro el programa.
judith garcia garcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-09-20 11:30 @521

Notapor explorer » 2007-09-20 14:22 @640

@RECORDINVOICE, en efecto, puede contener 1000 elementos, pero en el código se ve que cada uno de esos elementos es una referencia a un hash, de un tamaño que desconocemos.

Luego haces un par de 'tie', por lo que deducimos que los arrays están grabados en disco, en formato DB_File con tipo de registro $DB_Recno. Este último indica registros de igual tamaño. Pero lo que dudo es que la estructura de datos de array de hashes pueda ser grabada en disco con DB_File.
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 judith garcia garcia » 2007-09-20 14:46 @657

Sí lo hace, graba en disco, podemos ver los archivos que crea.
judith garcia garcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-09-20 11:30 @521

Notapor explorer » 2007-09-20 15:44 @697

Sí, ya sabemos que tie funciona y que los ficheros se crean, pero, ¿qué es lo que guardan?

Según tu código: %{$RECORDINVOICE[$i]}: @RECORDINVOICE es un array de hashes (referencias a). Eso quiere decir que los elementos no son elementos simples, sino complejos.

DB_File no puede almacenar valores complejos. Solo simples (cadenas de texto, números, etc). Salvo que se utilice también el módulo MLDBM. ¿Es así?

Otra forma de almacenar estructuras complejas es usando el módulo DBM::Deep.

Para saber el tamaño que está ocupando en memoria una variable, se suele utilizar el módulo Devel::Size.

En cuanto a tu código, yo no veo problemas.
Última edición por explorer el 2007-09-21 14:58 @665, editado 1 vez en total
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 judith garcia garcia » 2007-09-21 10:59 @499

Te agradezco toda tu colaboración y el interés que manifestaste en mi caso. La verdad es que no soy experta. Voy estudiar la información que me proporcionaste a ver cómo la aplico a lo que estoy manejando y después te cuento cómo me fue. Mil gracias.
judith garcia garcia
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-09-20 11:30 @521


Volver a Básico

¿Quién está conectado?

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