Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 35..

Estas en el tema de Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 35.. en el foro de PHP en Foros del Web. Hola amigos. Hace 1 día postee una duda existencial que me tenía desmoralizado. Ahora, ya más calmado y con más ánimos, hago frente a un ...
  #1 (permalink)  
Antiguo 02/05/2011, 10:36
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 35..

Hola amigos.

Hace 1 día postee una duda existencial que me tenía desmoralizado. Ahora, ya más calmado y con más ánimos, hago frente a un error que por lo que he podido comprobar es muy común:

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 35 bytes) in /opt/lampp/htdocs/pfc/php/tareas/graficos/graph_historicomsmanio_histogram.php on line 77

Veréis, lo que hago con este script es dibujar un gráfico tipo histograma. En el eje de las X tengo los meses (pueden ser variables: enero-marzo, febrero-abril, o enero-diciembre) y en el de las y's tengo una cantidad (1, 5, 0...).

Veréis, antes de nada en el script lo que hago es prepararme los datos, con varios arrays y varables, para luego pasarselos al JpGraph (una librería php para dibujar gráficos).

El problema solo ocurre cuando tengo que hacer un gráfico del año completo: Enero a Diciembre.

En los sucesivos posts os pongo el código, muchas gracias.

A ver si alguién me puede arrojar algo de luz. He probado todo, desde sintetizar el código (optimizarlo) hasta crear un nuevo fichero php por si estuviera corrupto.

Pero nada.

Saludos :D
  #2 (permalink)  
Antiguo 02/05/2011, 10:38
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

fichero graph_historicomsmanio_histogram.php:
Código PHP:
<?php

    
include_once ('../../funciones/funciones_comunes.php');
    include_once(
'../../../jpgraph/jpgraph.php');
    include_once (
'../../../jpgraph/jpgraph_line.php');
    include_once (
'../../../jpgraph/jpgraph_utils.inc.php');
    
    if ( !isset(
$_SESSION) ){
        
crearSesion();
    }
    
    
/* Creamos las variables $fechaInicioUnix y $fechaFinUnix, inicianizandolas con los valores de $_SESSION["estadisticas_fecha_inicio_unix"] y $_SESSION["estadisticas_fecha_fin_unix"] respectivamente */
    
$fechaInicioUnix $_SESSION["estadisticas_fecha_inicio_unix"]; //time() - ( 60 * 24 * 60 * 60 );
    
$fechaFinUnix $_SESSION["estadisticas_fecha_fin_unix"]; //time();
    /* Creamos las variables $fechaInicioUnix y $fechaFinUnix, inicianizandolas con los valores de $_SESSION["estadisticas_fecha_inicio_unix"] y $_SESSION["estadisticas_fecha_fin_unix"] respectivamente */
        
    //echo $fechaInicioUnix . "<br>";
    //echo $fechaFinUnix . "<br>";
    
    
$fechaInicioMysql unixToMySQL($fechaInicioUnix);
    
$fechaFinMysql unixToMySQL($fechaFinUnix);
    
    
//echo $fechaInicioMysql . "<br>";
    //echo $fechaFinMysql . "<br>";
    
    /* Creamos las variables $mesInicio y $anioInicio y las cargamos con los siguientes substrings haciendo uso de estas funciones: 
     * (int) substr($fechaInicioMysql, 5, 2) y (int) substr($fechaInicioMysql, 0, 4), respectivamente */
    
$mesInicio = (int) substr($fechaInicioMysql52);
    
$anioInicio = (int) substr($fechaInicioMysql04);
    
/* Creamos las variables $mesInicio y $anioInicio y las cargamos con los siguientes substrings haciendo uso de estas funciones: 
     * (int) substr($fechaInicioMysql, 5, 2) y (int) substr($fechaInicioMysql, 0, 4), respectivamente */
    
    /* Hacemos una cosa parecida para las variables $mesFin y $anioFin, con lo siguiente:
     * (int) substr($fechaFinMysql, 5, 2) y (int) substr($fechaFinMysql, 0, 4), respectivamente. */
    
$mesFin = (int) substr($fechaFinMysql52);
    
$anioFin = (int) substr($fechaFinMysql04);
    
/* Hacemos una cosa parecida para las variables $mesFin y $anioFin, con lo siguiente:
     * (int) substr($fechaFinMysql, 5, 2) y (int) substr($fechaFinMysql, 0, 4), respectivamente. */
    
    /* Creamos las variables $anioAux y $mesAux, inicianizandolas con los valores/contenidos de 0, $anioInicio y $mesInicio, respectivamente. */
    
$anioAux $anioInicio;
    
$mesAux $mesInicio;
    
/* Creamos las variables $anioAux y $mesAux, inicianizandolas con los valores/contenidos de 0, $anioInicio y $mesInicio, respectivamente. */
    
    
$datosDeBd obtenerNumeroInformesIncidenciasEntre2Fechas($fechaInicioMysql$fechaFinMysql);
    
ini_set('memory_limit','512M');
    if ( 
$datosDeBd != null ){
        
/* Creamos las variables $etiquetas y $datos como arrays vacios */
        
$etiquetas = array();
        
$datos = array();
        
/* Creamos las variables $etiquetas y $datos como arrays vacios */
        
$i 0;
        while ( 
$anioAux <= $anioFin && $mesAux <= $mesFin ){
                
            
//Resolvemos la problematica que ocurre cuando tenemos un numero menor de 10, que solo ocupa una cifra y
            //nos interesa que ocupe 2:
            
if( $mesAux 10 ){
                
/* Creamos la variable $id concatenando los valores de  $anioAux, "-0" y $mesAux */
                
$id $anioAux."-0".$mesAux;
                
/* Creamos la variable $id concatenando los valores de  $anioAux, "-0" y $mesAux */
            
}else{
                
/* Creamos la variable $id concatenando los valores de $anioAux, "-" y $mesAux  */
                
$id $anioAux."-".$mesAux;
                
/* Creamos la variable $id concatenando los valores de $anioAux, "-" y $mesAux  */
            
}
        
            
/* Añadimos al array $etiquetas el contenido de $id */
            
$etiquetas[$i] = $id;
            
/* Añadimos al array $etiquetas el contenido de $id */
            
            
if ( isset($datosDeBd[$id])) {
                
/* Añadimos al array $datos el cotenido de la variable $datosDeBd[$id]["cantidad"] */
                
$datos[$i] = $datosDeBd[$id]["cantidad"];
                
/* Añadimos al array $datos el cotenido de la variable $datosDeBd[$id]["cantidad"] */
            
}else{
                
/* Añadimos al array $datos el valor 0 */
                
$datos[$i] = 0;
                
/* Añadimos al array $datos el valor 0 */
            
}
        
            
/* Aumentamos en una unidad el contenido de $mesAux */
            
$mesAux++;
            
/* Aumentamos en una unidad el contenido de $mesAux */
            
$i++;
            if( 
$mesAux 12 ){
                
/* Restamos un año a $anioAux y $mesAux lo cargamos con 12 */
                
$anioAux--;
                
$mesAux 12;
                
/* Restamos un año a $anioAux y $mesAux lo cargamos con 12 */
            
}
        }
        
        
/* 
         * En este punto ya tenemos los datos preparados.
         * 
         * PERTENECIENTE AL JPGRAPH:
         * 
         */
        //print_r($datos);
        //print_r($etiquetas);
    
        /* Creamos un objeto Graph con tamaño de 600 de ancho y 400 de alto, y lo guardamos en $graph */
        
$graph = new Graph(600,400'auto');  
        
/* Creamos un objeto Graph con tamaño de 600 de ancho y 400 de alto, y lo guardamos en $graph */
      
        
$graph->img->SetMargin(40,40,40,40);
        
$graph->SetScale("textint");/*, 0, 0, $datos[0]-20, $datos[obtenerTamanoTabla($datos)-1]+20);*/
        //$graph->SetY2OrderBack(false);
        //$graph->SetY2Scale("lin",0,90);
    
        /* Creamos un nuevo objeto LinePlot pasandole como parametro $datos y lo guardamos en $lineplot */
        
$lineplot=new LinePlot($datos);//$datosOrdenadosYPreparados);
        /* Creamos un nuevo objeto LinePlot pasandole como parametro $datos y lo guardamos en $lineplot */
    
        
$lineplot->mark->SetType(MARK_X);
    
        
$graph->Add($lineplot);
    
        
$graph->xaxis->SetTitle("Meses"'center');
        
$graph->xaxis->SetTickLabels($etiquetas);
        
$graph->yaxis->SetTitle("Cantidad de informes"'center');
        
//$graph->yaxis->SetTickPositions(array(0,30,60,90,120,150), array(15,45,75,105,135));
        //$graph->SetBox(false);
    
    
 
        
$graph->title->SetFont(FF_FONT1,FS_BOLD);
        
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
        
$graph->yaxis->title->SetColor("gray");
        
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
        
$graph->xaxis->title->SetColor("gray");
    
 
        
$graph->yaxis->scale->SetGrace(50,50);
    
        
$lineplot->SetColor("red");
        
$lineplot->SetWeight(4);
        
$graph->yaxis->SetWeight(2);
        
$graph->yaxis->SetColor("red");
        
$graph->xaxis->SetWeight(2);
        
$graph->xaxis->SetColor("green");
        
$graph->SetShadow();
 
        
$graph->title->Set("Historico de sucesos entre: " date("Y-M"$_SESSION["estadisticas_fecha_inicio_unix"]) . " y " date("Y-M"$_SESSION["estadisticas_fecha_fin_unix"]));
    
        
// Display the graph
        
$graph->Stroke();
    }
    
?>
  #3 (permalink)  
Antiguo 02/05/2011, 10:39
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

Código PHP:
/**
 * 
 * @desc 
 * @param unknown_type $fechaInicio
 * @param unknown_type $fechaFin
 * @return 
 * 
 */
function obtenerNumeroInformesIncidenciasEntre2Fechas($fechaInicio, $fechaFin){
    
    $conn = conectarBd();
    /*
     * Es importante colocar el orden del BETWEEN correctamente: primero la fecha pequenia y luego la mayor.
     */
    /* Creamos la consulta en $query */
    $query = "SELECT tiempoParada FROM InformeIncidencia WHERE InformeIncidencia.estaPorCompletar=0 AND tiempoParada BETWEEN :fechaInicio AND :fechaFin ORDER BY tiempoParada";
    /* Creamos la consulta en $query */
    
    try{
        
        //$informes = $conn->query($query);
        
        $st = $conn->prepare($query);
        $st->bindParam(":fechaInicio", $fechaInicio, PDO::PARAM_STR);
        $st->bindParam(":fechaFin", $fechaFin, PDO::PARAM_STR);
        $st->execute();
        $informes = $st->fetchAll(PDO::FETCH_ASSOC);
        
        /* Creamos las variables $datosOrdenados (inicianizandola como un array vacio) y $hemosAnadido (inicianizandola con el valor false) */
        $datosOrdenados = array();
        $hemosAnadido = false;
        /* Creamos las variables $datosOrdenados (inicianizandola como un array vacio) y $hemosAnadido (inicianizandola con el valor false) */
        //print_r($informes);
        foreach ($informes as $informe){
            /* Creamos la variable $suFecha y la cargamos con el valor de $informe["tiempoParada"] */
            $suFecha = $informe["tiempoParada"];
            /* Creamos la variable $suFecha y la cargamos con el valor de $informe["tiempoParada"] */
            //print_r($suFecha);
            //Cogemos sus 7 primeros caracteres (del 0 al 6), cogiendo el mes y al anio que es lo
            //unico que nos interesa:
            /* Creamos la variable $suFechaMesYAnio obteniendo un substring de $suFecha: substr($suFecha, 0, 7) */
            $suFechaMesYAnio = substr($suFecha, 0, 7);
            /* Creamos la variable $suFechaMesYAnio obteniendo un substring de $suFecha: substr($suFecha, 0, 7) */
            
            //echo $suFecha . "<br />";
            //echo $suFechaMesYAnio . "<br />";
            
            if( !isset($datosOrdenados[$suFechaMesYAnio]) ){
                //anadimos eso:
                //echo "anadimos porque no existia <br />";
                
                /* Añadimos a las variables $datosOrdenados[$suFechaMesYAnio]["cantidad"] y $datosOrdenados[$suFechaMesYAnio]["date"]
                 * los valores 1 y el contenido de $suFechaMesYAnio, respectivamente */
                $datosOrdenados[$suFechaMesYAnio]["cantidad"] = 1;
                $datosOrdenados[$suFechaMesYAnio]["date"] = $suFechaMesYAnio;
                /* Añadimos a las variables $datosOrdenados[$suFechaMesYAnio]["cantidad"] y $datosOrdenados[$suFechaMesYAnio]["date"]
                 * los valores 1 y el contenido de $suFechaMesYAnio, respectivamente */
            }else{
                //como existe, sumamos una unidad a su cantidad de informes en ese mes de ese anio.
                //echo "anadimos ya que existia <br />";
                
                /* Aumentar el valor de $datosOrdenados[$suFechaMesYAnio]["cantidad"] en una unidad */
                $datosOrdenados[$suFechaMesYAnio]["cantidad"]++;
                /* Aumentar el valor de $datosOrdenados[$suFechaMesYAnio]["cantidad"] en una unidad */
            }
            /* Cargamos la variable $hemosAnadido con el valor true */
            $hemosAnadido = true;
            /* Cargamos la variable $hemosAnadido con el valor true */
        }
        
        desconectarBd($conn);
        
        if( !$hemosAnadido ){
            //Si no anadimos nada, devolvemos null.
            /* Cargamos la variable $devolver con el valor null */
            $devolver = null;
            /* Cargamos la variable $devolver con el valor null */
        }else{
            //devolvemos la lista
            /* Cargamos la variable $devolver con el contenido de $datosOrdenados */
            $devolver = $datosOrdenados;
            /* Cargamos la variable $devolver con el contenido de $datosOrdenados */
        }
        
        return $devolver;
        
    }catch(PDOException $e){
        ?>
    <p>Error en la consulta <?php echo $e->getMessage();?></p>
        <?php 
        desconectarBd
($conn);
    }
}
  #4 (permalink)  
Antiguo 02/05/2011, 10:44
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

La linea 77 es esta:

Código PHP:
$datos[$i] = 0
  #5 (permalink)  
Antiguo 02/05/2011, 11:03
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

SOLUCIONADO!
Para todo aquel que lea este post en un futuro y no sepa como solucionarlo, les comento lo que he hecho: he sustituido el bucle while() por un for() bien hecho.

Cambios simples los que he tenido que hacer (claro, hay que saber programación), he tenido que mover la actualización de variables que en el while estaba al final, pasando a estar en el for al principio.

A todo esto, el código se queda así:

Código PHP:
<?php

    
include_once ('../../funciones/funciones_comunes.php');
    include_once(
'../../../jpgraph/jpgraph.php');
    include_once (
'../../../jpgraph/jpgraph_line.php');
    include_once (
'../../../jpgraph/jpgraph_utils.inc.php');
    
    if ( !isset(
$_SESSION) ){
        
crearSesion();
    }
    
    
/* Creamos las variables $fechaInicioUnix y $fechaFinUnix, inicianizandolas con los valores de $_SESSION["estadisticas_fecha_inicio_unix"] y $_SESSION["estadisticas_fecha_fin_unix"] respectivamente */
    
$fechaInicioUnix $_SESSION["estadisticas_fecha_inicio_unix"]; //time() - ( 60 * 24 * 60 * 60 );
    
$fechaFinUnix $_SESSION["estadisticas_fecha_fin_unix"]; //time();
    /* Creamos las variables $fechaInicioUnix y $fechaFinUnix, inicianizandolas con los valores de $_SESSION["estadisticas_fecha_inicio_unix"] y $_SESSION["estadisticas_fecha_fin_unix"] respectivamente */
        
    //echo $fechaInicioUnix . "<br>";
    //echo $fechaFinUnix . "<br>";
    
    
$fechaInicioMysql unixToMySQL($fechaInicioUnix);
    
$fechaFinMysql unixToMySQL($fechaFinUnix);
    
    
//echo $fechaInicioMysql . "<br>";
    //echo $fechaFinMysql . "<br>";
    
    /* Creamos las variables $mesInicio y $anioInicio y las cargamos con los siguientes substrings haciendo uso de estas funciones: 
     * (int) substr($fechaInicioMysql, 5, 2) y (int) substr($fechaInicioMysql, 0, 4), respectivamente */
    
$mesInicio = (int) substr($fechaInicioMysql52);
    
$anioInicio = (int) substr($fechaInicioMysql04);
    
/* Creamos las variables $mesInicio y $anioInicio y las cargamos con los siguientes substrings haciendo uso de estas funciones: 
     * (int) substr($fechaInicioMysql, 5, 2) y (int) substr($fechaInicioMysql, 0, 4), respectivamente */
    
    /* Hacemos una cosa parecida para las variables $mesFin y $anioFin, con lo siguiente:
     * (int) substr($fechaFinMysql, 5, 2) y (int) substr($fechaFinMysql, 0, 4), respectivamente. */
    
$mesFin = (int) substr($fechaFinMysql52);
    
$anioFin = (int) substr($fechaFinMysql04);
    
/* Hacemos una cosa parecida para las variables $mesFin y $anioFin, con lo siguiente:
     * (int) substr($fechaFinMysql, 5, 2) y (int) substr($fechaFinMysql, 0, 4), respectivamente. */
    
    /* Creamos las variables $anioAux y $mesAux, inicianizandolas con los valores/contenidos de 0, $anioInicio y $mesInicio, respectivamente. */
    
$anioAux $anioInicio;
    
/* Creamos las variables $anioAux y $mesAux, inicianizandolas con los valores/contenidos de 0, $anioInicio y $mesInicio, respectivamente. */
    
    
$datosDeBd obtenerNumeroInformesIncidenciasEntre2Fechas($fechaInicioMysql$fechaFinMysql);
    
    if ( 
$datosDeBd != null ){
        
/* Creamos las variables $etiquetas y $datos como arrays vacios */
        
$etiquetas = array();
        
$datos = array();
        
/* Creamos las variables $etiquetas y $datos como arrays vacios */
        
        
for ($mesAux $mesInicio$anioAux <= $anioFin && $mesAux <= $mesFin$mesAux++){
            if( 
$mesAux 12 ){
                
/* Restamos un año a $anioAux y $mesAux lo cargamos con 12 */
                
$anioAux--;
                
$mesAux 12;
                
/* Restamos un año a $anioAux y $mesAux lo cargamos con 12 */
            
}
            
//Resolvemos la problematica que ocurre cuando tenemos un numero menor de 10, que solo ocupa una cifra y
            //nos interesa que ocupe 2:
            
if( $mesAux 10 ){
                
/* Creamos la variable $id concatenando los valores de  $anioAux, "-0" y $mesAux */
                
$id $anioAux."-0".$mesAux;
                
/* Creamos la variable $id concatenando los valores de  $anioAux, "-0" y $mesAux */
            
}else{
                
/* Creamos la variable $id concatenando los valores de $anioAux, "-" y $mesAux  */
                
$id $anioAux."-".$mesAux;
                
/* Creamos la variable $id concatenando los valores de $anioAux, "-" y $mesAux  */
            
}
        
            
/* Añadimos al array $etiquetas el contenido de $id */
            
$etiquetas[] = $id;
            
/* Añadimos al array $etiquetas el contenido de $id */
            
            
if ( isset($datosDeBd[$id])) {
                
/* Añadimos al array $datos el cotenido de la variable $datosDeBd[$id]["cantidad"] */
                
$datos[] = $datosDeBd[$id]["cantidad"];
                
/* Añadimos al array $datos el cotenido de la variable $datosDeBd[$id]["cantidad"] */
            
}else{
                
/* Añadimos al array $datos el valor 0 */
                
$datos[] = 0;
                
/* Añadimos al array $datos el valor 0 */
            
}
        }
        
        
/* 
         * En este punto ya tenemos los datos preparados.
         * 
         * PERTENECIENTE AL JPGRAPH:
         * 
         */
        //print_r($datos);
        //print_r($etiquetas);
    
        /* Creamos un objeto Graph con tamaño de 600 de ancho y 400 de alto, y lo guardamos en $graph */
        
$graph = new Graph(600,400'auto');  
        
/* Creamos un objeto Graph con tamaño de 600 de ancho y 400 de alto, y lo guardamos en $graph */
      
        
$graph->img->SetMargin(40,40,40,40);
        
$graph->SetScale("textint");/*, 0, 0, $datos[0]-20, $datos[obtenerTamanoTabla($datos)-1]+20);*/
        //$graph->SetY2OrderBack(false);
        //$graph->SetY2Scale("lin",0,90);
    
        /* Creamos un nuevo objeto LinePlot pasandole como parametro $datos y lo guardamos en $lineplot */
        
$lineplot=new LinePlot($datos);//$datosOrdenadosYPreparados);
        /* Creamos un nuevo objeto LinePlot pasandole como parametro $datos y lo guardamos en $lineplot */
    
        
$lineplot->mark->SetType(MARK_X);
    
        
$graph->Add($lineplot);
    
        
$graph->xaxis->SetTitle("Meses"'center');
        
$graph->xaxis->SetTickLabels($etiquetas);
        
$graph->yaxis->SetTitle("Cantidad de informes"'center');
        
//$graph->yaxis->SetTickPositions(array(0,30,60,90,120,150), array(15,45,75,105,135));
        //$graph->SetBox(false);
    
    
 
        
$graph->title->SetFont(FF_FONT1,FS_BOLD);
        
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
        
$graph->yaxis->title->SetColor("gray");
        
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
        
$graph->xaxis->title->SetColor("gray");
    
 
        
$graph->yaxis->scale->SetGrace(50,50);
    
        
$lineplot->SetColor("red");
        
$lineplot->SetWeight(4);
        
$graph->yaxis->SetWeight(2);
        
$graph->yaxis->SetColor("red");
        
$graph->xaxis->SetWeight(2);
        
$graph->xaxis->SetColor("green");
        
$graph->SetShadow();
 
        
$graph->title->Set("Historico de sucesos entre: " date("Y-M"$_SESSION["estadisticas_fecha_inicio_unix"]) . " y " date("Y-M"$_SESSION["estadisticas_fecha_fin_unix"]));
    
        
// Display the graph
        
$graph->Stroke();
    }
    
?>
  #6 (permalink)  
Antiguo 02/05/2011, 11:05
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

Una de dos:

O yo tenía mal programado el bucle while (que como en la vida, siempre tenemos fallos), o internamente es más eficiente el bucle for que el while (que puede ser, aunque la lógica nos indica todo lo contrario).

Recordar que para aquella persona que requiera del uso de un bucle for(), una manera de salirse dada una condición (dentro del bucle):

Código PHP:
if ( /*condicion */ ) {
    break;

Un saludo y es un gran apoyo tener foros tan activos como este, con gente dispuesta a ayudarte!
  #7 (permalink)  
Antiguo 02/05/2011, 12:07
Avatar de Sotelio  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago de Chile
Mensajes: 68
Antigüedad: 11 años, 2 meses
Puntos: 21
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

Hola

Las condiciones del while eran:

Código PHP:
while ( $anioAux <= $anioFin && $mesAux <= $mesFin ){ 
El único cambio que haces a $anioAux es $anioAux-- por lo tanto la primera parte de la condición siempre es verdadera.

Luego en $mesAux el único cambio que haces es:
Código PHP:
if( $mesAux 12 ){ 
     
$anioAux--; 
     
$mesAux 12

Y si suponemos que $mesFin es igual a 12, cuando $mesAux lo alcanza, o sea, es igual a 13, dentro del if lo vuelves a dejar en 12, por lo tanto nunca sobrepasará a $mesFin.

Y el error es simplemente porque se ejecuta un loop infinito, la líne del error da lo mismo.

Lo contradictorio eso sí, es que el problema es de memoria, y el mensaje de error dice "try to allocate 35bytes" lo que es mucho menor que el máximo que son "536870912", esto es porque php indica los bytes procesados en la línea que sobrepasa el máximo:
Código PHP:
$datos[$i] = 0
pero no el total de bytes utilizados. Esto puede llevar a un enredo o error.

Suerte
Sotelio
  #8 (permalink)  
Antiguo 02/05/2011, 16:13
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

Amigo, creo que te has pasado por alto la linea en la que hago lo siguiente:

Código PHP:
$mesAux++; 
Así que no puede ser un bucle infinito, otra cosa es que la condición para anioAux casi siempre se cumpla, y la mayoría de las veces sea la de los meses la que hiciera salirse del while.

Pero creo que ese no era el problema. Aún así lo solucioné cambiando el while por un for, y adaptando el código al for.

Gracias ^^
  #9 (permalink)  
Antiguo 02/05/2011, 23:35
Avatar de Sotelio  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago de Chile
Mensajes: 68
Antigüedad: 11 años, 2 meses
Puntos: 21
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

Hola, @russellhoff

Me refería al primer script, el segundo con la "solución" no lo revisé.

Primero, hacer esto:
Código PHP:
while (b) {
...
...
...

  if (
cualquier condicio) {
     
a--;
  }

No tiene sentido, ya que nunca a podrá ser mayor a b para que se termine el ciclo. Tampoco se incremente a. Y eso es la primera parte de la condición del primer script, lo hiciste con $anioAux.

Y segundo, $mesAux en el primer script debe ser mayor a $mesFin para que termine el while. Suponiendo que $mesFin es igual a 12, este código:
Código PHP:
if( $mesAux 12 ){ 
     
$anioAux--; 
     
$mesAux 12

Hace que cuando $mesAux sea igual a 13, vuelva a ser 12, por lo tanto nunca $mesAux será mayor que $mesFin.

En resumen, el problema ocurría sólo cuando $mesFin = 12.

Saludos
Sotelio
  #10 (permalink)  
Antiguo 19/07/2011, 09:40
 
Fecha de Ingreso: noviembre-2010
Ubicación: laudio
Mensajes: 61
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to al

Lo que he hecho ha sido aligerar el código y hacerlo más eficiente. Ya se solucionó hace unos meses. Gracias!!

Etiquetas: fatal, size, byte
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 03:17.