Dans mon script PHP, j'ai besoin de créer un tableau de >600 k entiers. Malheureusement, mes serveurs memory_limit
est fixé à 32M donc, lors de l'initialisation de la matrice le script échoue avec message d'
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 71 bytes) in /home/www/myaccount/html/mem_test.php sur la ligne 8
Je suis conscient du fait que PHP ne pas stocker le tableau des valeurs comme la plaine des entiers, mais plutôt comme zvalues qui sont beaucoup plus gros que la plaine valeur entière (8 octets sur mon système 64 bits). J'ai écrit un petit script pour estimer la quantité de mémoire chaque entrée de ce tableau utilise et il s'avère que c'est assez exactement 128 octets. 128!!! J'aurais besoin d' >73M juste pour stocker le tableau. Malheureusement, le serveur n'est pas sous mon contrôle et je ne peut pas augmenter le memory_limit
.
Ma question est, est-il possible en PHP pour créer un tableau-comme une structure qui utilise moins de mémoire. Je n'ai pas besoin de cette structure associative (plaine de l'indice d'accès est suffisant). Il également n'a pas besoin d'avoir un redimensionnement dynamique - je sais exactement comment big le tableau sera. Aussi, tous les éléments seraient du même type. Tout comme un bon vieux C-tableau.
Edit: Donc deceze's solution fonctionne out-of-the-box avec les nombres entiers de 32 bits. Mais même si vous êtes sur un système 64 bits, pack() ne semblent pas supporter les entiers 64 bits. Afin d'utiliser les entiers 64 bits dans mon tableau j'ai appliqué un peu de manipulation de bits. Peut-être au-dessous des extraits seront de l'aide à quelqu'un:
function push_back(&$storage, $value)
{
// split the 64-bit value into two 32-bit chunks, then pass these to pack().
$storage .= pack('ll', ($value>>32), $value);
}
function get(&$storage, $idx)
{
// read two 32-bit chunks from $storage and glue them back together.
return (current(unpack('l', substr($storage, $idx * 8, 4)))<<32 |
current(unpack('l', substr($storage, $idx * 8+4, 4))));
}