Foros del Web » Programando para Internet » PHP »

problemas con memoria

Estas en el tema de problemas con memoria en el foro de PHP en Foros del Web. Al ejecutar lo siguiente: while ($dia!='; ') { $dia = fgets($archivo, 2); $valores_l[$numero_l]=((double)$dia); $numero_l++; } Me da el siguiente error: Fatal error: Allowed memory size ...
  #1 (permalink)  
Antiguo 28/07/2003, 03:29
 
Fecha de Ingreso: julio-2003
Mensajes: 2
Antigüedad: 14 años, 4 meses
Puntos: 0
problemas con memoria

Al ejecutar lo siguiente:

while ($dia!='; ')
{

$dia = fgets($archivo, 2);
$valores_l[$numero_l]=((double)$dia);


$numero_l++;
}

Me da el siguiente error:

Fatal error: Allowed memory size of 8388608 bytes exhausted at (null):0 (tried to allocate 524288 bytes) in /data/members/free/tripod/es/g/i/n/ginfonet/htdocs/calab/abrir.php on line 24


la linea 24 es $valores_l[$numero_l]=((double)$dia);

¿Alguien me podria decir en que falla?
¿como se realiza la reserva de memoria en php?
  #2 (permalink)  
Antiguo 28/07/2003, 16:38
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 meses
Puntos: 1
Hola,

Me parece que el problema debe resultar a causa de que el cuerpo del ciclo se ejecuta tantas veces que la asignación de memoria al arreglo $valores_l termina agotando la memoria disponible para el intérprete. El mensaje de error que recibes es sólo un resultado incidental de un descuido en la construcción del ciclo. Pareciera que el intérprete tuviera un límite para la ubicación de memoria relativamente bajo (~8MB) o no hubiera un límite muy restrictivo para el tiempo de ejecución del programa, ya que de otro modo hubieras podido también recibir un mensaje del tipo:

Cita:
Fatal error: Maximum execution time of NN seconds exceeded in /ruta/hacia/archivo.php on line XX
Te recomendaría que revisaras cuidadosamente la condición del `while', y el cuerpo del ciclo en general, para asegurarte de que éste no se ejecute más veces de lo necesario.

Por ejemplo, en la condición del while comparas el valor de la variable $dia con una cadena de dos caracteres ('; '). Sin embargo, $dia no va a recibir cadenas de ese tamaño mediante el llamado a fgets(), ya que el segundo argumento de esta función es usado como un límite para leer cierto número de caracteres de un archivo, y se leen como máximo (límite - 1) caracteres. Es decir, en tu ejemplo $dia va a recibir cadenas de máximo 1 caracter de tamaño de la función fgets().

Ma parece que tu programa debería lucir algo así:

Código:
<?php

$archivo = fopen ('archivo.txt', 'r');

$dia = fgets ($archivo, 3);

$numero_l = 0;
while ($dia != '; ' and ! feof ($archivo)) {
    $valores_l[$numero_l++] = (double) $dia;
    $dia = fgets ($archivo, 3);
}

fclose ($archivo);

?>
Asumiendo que el archivo del que lees los datos (en este ejemplo `archivo.txt'), luce algo así:

Código:
10203040; 5060
En este ejemplo, se leerían los valores 10, 20, 30 y 40.

Respecto a la reservación de memoria en PHP, en realidad no hay nada exótico en el proceso. La memoria de las variables se asigna dinámicamente, y en el caso de las arreglos, el tamaño de estos puede crecer o disminuir en la medida en que el programador lo necesite, usando algoritmos bastante comunes. El problema en tu caso, te repito, parece que fuera un ciclo que no sigue la lógica que deseas realmente.

Un cordial saludo
  #3 (permalink)  
Antiguo 29/07/2003, 02:50
 
Fecha de Ingreso: julio-2003
Mensajes: 2
Antigüedad: 14 años, 4 meses
Puntos: 0
Gracias tio, ya esta todo resuelto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:22.