Antecedentes: tengo una gran matriz 2D de enteros que necesito cargar en la memoria en PHP para cada solicitud de Apache. Quiero que ocupe menos memoria.¿Es posible usar ints cortos (16 bits) en PHP?
PHP almacena ints en PHP_INT_SIZE
bytes, que son 32 bits en la mayoría de los sistemas. Todos los enteros son menores que 2^16, lo que significa que podrían ser short int (por ejemplo, en C). ¿Estoy en lo cierto al pensar que almacenar las entradas como cortas ocuparía la mitad de la RAM?
Idealmente me gustaría ser capaz de hacer:
$s = (short) 1234; // takes up 2 bytes instead of 4
Más información:
- El conjunto ocupa alrededor de 100 MB de RAM y se genera mediante la inclusión de un 30MB var_export() volcar
- La matriz está escrita en un proceso cron. Solo la lectura debe ser eficiente en cuanto a la memoria (y rápida)
- Las únicas operaciones que necesito hacer en los enteros son compararlas todas (<,>, ===) y luego leer algunas de ellas (similar al Floyd-Warshall algorithm)
- lectura cada valor de una DB es demasiado lento, ya que hay unos pocos cientos de millones de lecturas por petición
Algunas ideas locas:
- uso pack()/unpack() pero eso todavía tienda los valores como 32 bi t enteros cuando se instalan los
- tienda los valores que los píxeles de una imagen y de uso de PHP de GD library para leerlos (¿Esto sería lento)
- Uso shmop_read() y tienen los procesos de Apache comparten la matriz
- Memcached podría funcionar, pero no tengo ninguna experiencia con ella y yo supongo que sería muchas veces más lento que una matriz PHP nativo
- aprender C++ y escribir una extensión de PHP
- recompilación PHP (o HipHop?) utilizar 2 bytes para enteros
- use Igbinary (útil, pero tendrá el mismo problema que el paquete())
definitivamente uso las funciones shmop_ * ... aparte de eso, solo puedo pensar en lo mismo que se le ocurre a BarsMonster. –
¿Estás seguro de que no puedes usar mysql y tablas de memoria? Tal vez incluso podría escribir las comparaciones en forma de consulta para evitar enviar y recibir datos con php –
serialize y unserialize son más rápidos que var_export, btw – raveren