Si quiere una matriz indexada real, use SplFixedArray. Usa menos memoria. Además, PHP 5.3 tiene un recolector de basura mucho mejor.
Aparte de eso, bueno, PHP usará más memoria que un equivalente C/C++ escrito más cuidadosamente.
uso de memoria para 1024x1024 matriz de enteros:
- matriz estándar: 218.756.848
- SplFixedArray: 92.914.208
medido por memory_get_peak_usage()
$array = new SplFixedArray(1024 * 1024); // array();
for ($i = 0; $i < 1024 * 1024; ++$i)
$array[$i] = 0;
echo memory_get_peak_usage();
Tenga en cuenta que la misma matriz en C usar enteros de 64 bits sería 8M.
Como han sugerido otros, podría empaquetar los datos en una cadena. Esto es más lento pero mucho más eficiente de la memoria. Si el uso de valores de 8 bits que es muy fácil:
$x = str_repeat(chr(0), 1024*1024);
$x[$i] = chr($v & 0xff); // store value $v into $x[$i]
$v = ord($x[$i]); // get value $v from $x[$i]
Aquí la memoria sólo habrá aproximadamente 1,5 MB (es decir, cuando se considera toda la sobrecarga de PHP con sólo esta matriz de cadenas entero).
Por el gusto de hacerlo, creé un punto de referencia simple para crear enteros de 824 bits de 1024x1024 y luego recorrerlos una vez. Las versiones empaquetadas usaron ArrayAccess
para que el código de usuario tuviera el mismo aspecto.
mem write read
array 218M 0.589s 0.176s
packed array 32.7M 1.85s 1.13s
packed spl array 13.8M 1.91s 1.18s
packed string 1.72M 1.11s 1.08s
Las matrices utilizadas envasados nativos enteros de 64 bits (sólo embalaje 7 bytes de evitar el trato con los datos firmados) y la cadena de empaquetado utilizados ord
y chr
. Obviamente, los detalles de implementación y las especificaciones de la computadora afectarán un poco las cosas, pero espero que obtenga resultados similares.
Por lo tanto, aunque la matriz era 6 veces más rápida, también usaba 125 veces la memoria como la siguiente mejor alternativa: cadenas empaquetadas. Obviamente, la velocidad es irrelevante si se está quedando sin memoria. (Cuando usé cadenas empaquetadas directamente sin una clase ArrayAccess
, solo fueron 3 veces más lentas que las matrices nativas).)
En resumen, usaría algo más que PHP puro para procesar estos datos si la velocidad es una preocupación.
Las matrices realmente tienen mucha memoria en PHP (ya que en realidad son diccionarios). Si puede renunciar a una (¡mucha) velocidad, puede [falsificar matrices binarias como en C] (http://stackoverflow.com/questions/5505124/cheating-php-integers/5505643#5505643), también para estructuras 2D Supongo. Pero tal vez realmente desee investigar el compilador HipHop PHP a C++ (https://github.com/facebook/hiphop-php/wiki/). – mario
Cada variable en PHP tiene una sobrecarga asociada a ella. No solo tiene que almacenarse el valor de la variable, sino también el nombre, tipo, etc. de la variable ... Incluso un simple '$ x [1] = 2;' tiene un gran cuerpo de cosas adicionales que lo siguen. –
¿Qué tal una extensión de php? – Bytemain