Necesita una estructura similar a una matriz en PHP con un uso mínimo de memoria

En mi script PHP necesito crear una matriz de> 600k enteros. Lamentablemente mis servidores webmemory_limit se establece en 32M, por lo que al inicializar la matriz, el script se cancela con el mensaje

Error fatal: Se ha agotado el tamaño de memoria permitida de 33554432 bytes (se intentó asignar 71 bytes) en/home/www/myaccount/html/mem_test.php en linea8

Soy consciente del hecho de que PHP no almacena los valores de la matriz como enteros simples, sino más bien como valores de z que son mucho más grandes que el valor de entero simple (8 bytes en mi sistema de 64 bits). Escribí una pequeña secuencia de comandos para estimar la cantidad de memoria que utiliza cada entrada de la matriz y resulta que son casi exactamente 128 bytes. 128 !!! Necesitaría> 73M solo para almacenar la matriz. Desafortunadamente, el servidor web no está bajo mi control, por lo que no puedo aumentar elmemory_limit.

Mi pregunta es, ¿hay alguna posibilidad en PHP para crear una estructura similar a una matriz que use menos memoria? No necesito que esta estructura sea asociativa (el acceso a índice simple es suficiente). Tampoco es necesario tener un cambio de tamaño dinámico, ya que sé exactamente cuán grande será la matriz. Además, todos los elementos serían del mismo tipo. Al igual que un buen viejo C-array.

Editar: Asi quedecezeLa solución funciona de forma inmediata con enteros de 32 bits. Pero incluso si estás en un sistema de 64 bits,paquete() No parece admitir enteros de 64 bits. Para usar enteros de 64 bits en mi matriz, apliqué algo de manipulación de bits. Quizás los siguientes fragmentos sean de ayuda para alguien:

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))));
}

Respuestas a la pregunta(8)

Su respuesta a la pregunta