Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] arrays: Allowed memory size of x bytes exhausted

Estas en el tema de arrays: Allowed memory size of x bytes exhausted en el foro de PHP en Foros del Web. Hola todos Tengo un arreglo al que le quiero asignar solo 2 valores: $setp[1385521313]=121.74; $setp[ 1385525054 ]=121.33; Lo que me imprime un error en la ...
  #1 (permalink)  
Antiguo 10/04/2014, 10:05
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
arrays: Allowed memory size of x bytes exhausted

Hola todos

Tengo un arreglo al que le quiero asignar solo 2 valores:

$setp[1385521313]=121.74;
$setp[1385525054]=121.33;

Lo que me imprime un error en la segunda linea:

Fatal error: Allowed memory size of 26214400 bytes exhausted (tried to allocate 1385525056 bytes) in...

Lo que me hace suponer que al asignar una variable a una posición númerica de un array, tambien registra todas las posiciones anteriores, o sea al hacer esto:

$foo[3]=1;

tambien está registrando las posiciones $foo[0], $foo[1] y $foo[2] consumiendo en total 4 bytes.

Estoy en lo correcto?

por que solo ocurre el error al insertar la segunda posición y no solo la primera?

Conocen alguna forma de hacer que esto no suceda?


-----------------------------------

Por cierto, si alguien tiene este problema, se puede solucionar usando strings:

$setp['p1385521313']=121.74;
$setp['p1385525054']=121.33;
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 10/04/2014, 17:18
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: arrays: Allowed memory size of x bytes exhausted

Muy interesante, habrá que probar para ver el comportamiento.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 10/04/2014, 20:30
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: arrays: Allowed memory size of x bytes exhausted

Cita:
Iniciado por stramin Ver Mensaje
Hola todos

Tengo un arreglo al que le quiero asignar solo 2 valores:

$setp[1385521313]=121.74;
$setp[1385525054]=121.33;

Lo que me imprime un error en la segunda linea:

Fatal error: Allowed memory size of 26214400 bytes exhausted (tried to allocate 1385525056 bytes) in...

Lo que me hace suponer que al asignar una variable a una posición númerica de un array, tambien registra todas las posiciones anteriores, o sea al hacer esto:

$foo[3]=1;

tambien está registrando las posiciones $foo[0], $foo[1] y $foo[2] consumiendo en total 4 bytes.

Estoy en lo correcto?
No, cuando tu haces eso el arreglo comienza a partir del indice 3: ejemplo
Código PHP:
Ver original
  1. $array[50] = 100;
  2. $array[] = 101;
  3. $array[] = 102;
  4. $array[] = 103;
  5.  
  6. var_dump($array);
vas a obtener como resultado:
Código:
array(4) {
  [50]=>
  int(100)
  [51]=>
  int(101)
  [52]=>
  int(102)
  [53]=>
  int(103)
}
Esto es el comportamiento esperado y viene documentado en el manual
Cita:
por que solo ocurre el error al insertar la segunda posición y no solo la primera?

Conocen alguna forma de hacer que esto no suceda?
Recuerda que el indice de un arreglo solo puedes aceptar enteros y cadenas, asi que con tu ejemplo estas asignando un entero muy grande a un indice, cuando asignas el siguiente es la posición mas uno así que para la cantidad de memoria que tenias asignada al script no fue suficiente. Lo resuelves usando arreglos asociativos como lo hiciste o asignando indicies mas realistas o si realmente es el caso de tener que asignar un entero grande pues aumenta la cantidad de memoria que estas asignando a la ejecución del script y también toma en cuenta la arquitectura que usas por que el tamaño máximo de un entero en máquinas de 32 bits difiere considerablemente de las de 64 bit. Toda esta verborrea las puedes ver en terminos mas practicos usando IDEs que soporten profiling y xdebug.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 11/04/2014, 08:21
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: arrays: Allowed memory size of x bytes exhausted

vaya hhs, no sabía nada de eso, pero aún no me queda claro por que si estoy asignando 2 índices dice que he consumido toda la memoria asignada (que actualmente es 24mb, o sea 26214400 bytes).

tengo la sensación de que al asignar el primer indice (1385521313) solo ubica ese valor en memoria, pero al asgnar el segundo (1385525054) es cuando crea la correlación.

1385521313
1385521314
1385521315
...
1385525052
1385525053
1385525054

Pero eso solo serían 3741 índices, lo que no es suficiente para desbordar la memoria asignada.

Como sugirió triby, he hecho estas pruebas para forzar el error:
Código PHP:
Ver original
  1. $arr['a']='texto';
  2. $arr['a'][1]=1.133;
  3. echo "OK: ".$arr['a'][1];
Imprime:
OK: 1

Código PHP:
Ver original
  1. $arr['a']='texto';
  2. $arr['a'][1024]=1.133;
  3. echo "OK: ".$arr['a'][1024];
Imprime:
OK: 1

Código PHP:
Ver original
  1. $arr['a']='texto';
  2. $arr['a'][24903654]=1.133;
  3. echo "OK: ".$arr['a'][24903654];
Imprime:
OK: 1

Código PHP:
Ver original
  1. $arr['a']='texto';
  2. $arr['a'][24903655]=1.133;
  3. echo "OK: ".$arr['a'][24903655];
Imprime:
Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 24903657 bytes) in...

Alguien puede explicar que pasa?

por cierto estoy usando ese valor de indice por que es una fecha unix.
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #5 (permalink)  
Antiguo 11/04/2014, 08:37
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: arrays: Allowed memory size of x bytes exhausted

24mb son 25165824bytes, tal como indica php en su error.

El asunto es que cada cifra del índice es un espacio en la memoria, es como una estanteria con libros.

Una estanteria tiene 10 filas, las primeras desde abajo hacia arriba estan vacias, la 9 y la 10 tienen libros, pero tu intenas meter un libro en la fila 11....Si, las filas de abajo estan vacias, pero y las podrias usar si usarias un indice mas bajo.

No lo he probado, pero y que tal si guardar la cifra como string....no es necesario que pongas una p delante como has puesto en tu primer mensaje, sino tan solo usa comillas simples para delimitar el numero. Teóricamente deberia servir.

Luego como php es muy pasivo con los tipos de datos, cuando saques esa posicion y hagas operaciones numericas posteriormente (como convertirlo a fecha real) no deberia ser un problema que php vea que el string es un numero.

EDIT;

algo así

Código PHP:
$arr['a']='texto';
$arr['a']['24903655']=1.133
  #6 (permalink)  
Antiguo 11/04/2014, 08:40
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: arrays: Allowed memory size of x bytes exhausted

Cita:
Iniciado por hhs Ver Mensaje
No, cuando tu haces eso el arreglo comienza a partir del indice 3
Eso es un error. Si bien el arreglo cuenta con 3 indices, el sistema operativo le reserva memoria para poder completar desde el indice 0 al maximo.

Si bien PHP es bastante flexible con los arrays, estos siguen manteniendo este tipo de limitaciones.

Saludos!
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #7 (permalink)  
Antiguo 11/04/2014, 09:27
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: arrays: Allowed memory size of x bytes exhausted

Cita:
Iniciado por Qazser Ver Mensaje
24mb son 25165824bytes, tal como indica php en su error.

El asunto es que cada cifra del índice es un espacio en la memoria, es como una estanteria con libros.

Una estanteria tiene 10 filas, las primeras desde abajo hacia arriba estan vacias, la 9 y la 10 tienen libros, pero tu intenas meter un libro en la fila 11....Si, las filas de abajo estan vacias, pero y las podrias usar si usarias un indice mas bajo.

No lo he probado, pero y que tal si guardar la cifra como string....no es necesario que pongas una p delante como has puesto en tu primer mensaje, sino tan solo usa comillas simples para delimitar el numero. Teóricamente deberia servir.

Luego como php es muy pasivo con los tipos de datos, cuando saques esa posicion y hagas operaciones numericas posteriormente (como convertirlo a fecha real) no deberia ser un problema que php vea que el string es un numero.

EDIT;

algo así

Código PHP:
$arr['a']='texto';
$arr['a']['24903655']=1.133
Si, lo intenté pero sigue dando el mismo error, supongo que se convierte a número, por eso le puse esa 'p' al principio, también intenté con:

Código PHP:
$arr['a']='texto';
$arr['a'][(string)'24903655']=1.133
Cita:
Iniciado por h2swider Ver Mensaje
Eso es un error. Si bien el arreglo cuenta con 3 indices, el sistema operativo le reserva memoria para poder completar desde el indice 0 al maximo.

Si bien PHP es bastante flexible con los arrays, estos siguen manteniendo este tipo de limitaciones.

Saludos!
Entiendo, entonces es como había pensado, ser reserva la memoria aunque solo haya guardado 1 variable, tal como pasa en C, esto es un tema bastante interesante, por lo que veo me convendrá guardar todos mis arreglos con indices alfanuméricos para ahorrar memoria.

Se que también podría aumentar la memoria disponible pero creo que será más eficiente no darle más carga al servidor.

Gracias a todos por las respuestas, he aprendido algo nuevo :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #8 (permalink)  
Antiguo 11/04/2014, 10:00
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: arrays: Allowed memory size of x bytes exhausted

Cita:
Iniciado por stramin Ver Mensaje
Si, lo intenté pero sigue dando el mismo error, supongo que se convierte a número, por eso le puse esa 'p' al principio, también intenté con:
$arr['a'][(string)'24903655']=1.133;[/PHP]
Yo creo que es tan simple como concatenar un string al numero.
Código PHP:
Ver original
  1. $arr['i_'.'24903655']=1.133;
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives

Etiquetas: allowed, arrays, memory, size, variable
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 13:27.