Hintergrund: Ich habe ein großes 2D-Array mit ganzen Zahlen, das ich in PHP für jede Apache-Anfrage in den Speicher laden muss. Ich möchte, dass es weniger Speicherplatz benötigt.
PHP speichert Ints in PHP_INT_SIZE
Bytes, was auf den meisten Systemen 32 Bit entspricht. Alle Ganzzahlen sind kleiner als 2^16, d.h. sie könnten ein kurzes Int (z.B. in C). Liege ich richtig in der Annahme, dass die Speicherung von ints als kurz würde die Hälfte des RAM nehmen?
Im Idealfall würde ich das gerne tun können:
$s = (short) 1234; // takes up 2 bytes instead of 4
Mehr Informationen:
- Das Array beansprucht etwa 100 MB RAM und wird durch Einfügen einer 30 MB var_export() abladen
- Das Array wird in einen Cron-Prozess geschrieben. Nur das Lesen muss speichereffizient (und schnell) sein
- Die einzigen Operationen, die ich mit den ganzen Zahlen durchführen muss, sind der Vergleich aller Zahlen (<, >, ===) und das Lesen einiger weniger Zahlen (ähnlich wie bei der Floyd-Warshall-Algorithmus )
- Das Lesen der einzelnen Werte aus einer DB ist viel zu langsam, da pro Anfrage mehrere hundert Millionen Werte gelesen werden.
Einige verrückte Ideen:
- Verwenden Sie pack() / auspacken() aber das würde die Werte immer noch als 32-Bit-Ints speichern, wenn sie ausgepackt werden
- Speichern Sie die Werte als Pixel in einem Bild und verwenden Sie PHPs GD-Bibliothek um sie zu lesen (wäre das zu langsam)
- Verwenden Sie shmop_read() und die Apache-Prozesse sollen sich das Array
- Memcached könnte funktionieren, aber ich habe keine Erfahrung damit und ich vermute, es wäre um ein Vielfaches langsamer als ein natives PHP-Array
- C++ lernen und eine PHP-Erweiterung schreiben
- PHP neu kompilieren (oder HipHop ?) 2 Bytes für Ints zu verwenden
- Verwenden Sie Igbinär (nützlich, hat aber das gleiche Problem wie pack())