Arka plan: Ben her Apache istek için PHP belleğe yüklemek için gereken tamsayılar büyük bir 2D dizi var. Ben daha az bellek almak istiyorum.
Çoğu sistemlerde 32 bit PHP_INT_SIZE
bayt, PHP depolar ints. Bütün tamsayılar bir short int (örneğin, C) olabilir, yani en az 16 ^ 2 'dir. Birazdan kısa İnts saklamak yarım RAM kadar alacağını düşünerek mıyım?
İdeal yapabilmek istiyorum:
$s = (short) 1234; // takes up 2 bytes instead of 4
Daha fazla bilgi:
- Dizi RAM 100mb yaklaşık kaplıyor ve 30MB var_export() dökümü dahil tarafından oluşturulan
- Dizi cron süreci yazılır. Sadece okuma bellek verimli (ve hızlı) olması gerekir
- Ben tamsayılar yapmanız gereken sadece işlemleri (<,>, ===) hepsi karşılaştırarak ve sonra (Floyd-Warshall algoritmasına benzer) birkaç tanesi okuyor
- DB her değer okunurken birkaç yüz milyon istek başına okur olarak orada yol çok yavaş
Bazı çılgın fikirleri:
- Kullan pack() / unpack() ama çözdükten zaman hala 32 bit ints gibi değerleri saklamak istiyorsunuz
- Bir görüntüdeki piksel gibi değerleri saklamak ve GD library (bu yavaş olurdu) onları okumak için PHP'nin kullanın
- shmop_read() kullanın ve Apache süreçler dizi paylaşmak var
- Memcached çalışır ama onunla hiçbir deneyime sahip ve bunu bir doğal PHP dizide birçok kez daha yavaş olacağını tahmin olabilir
- C + + öğrenmek ve bir PHP uzantısı yazmak
- Derleyişinizde PHP (veya HipHop?) Ints için 2 byte kullanarak
- Igbinary kullanın (yararlı, ama paketi aynı sorun olacaktır ())