Ver Mensaje Individual
  #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, 9 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.