Arka plan: Her Apache isteği için PHP'de belleğe yüklemem gereken büyük bir 2B dizi tam sayı var. Daha az bellek almasını istiyorum.PHP'de kısa girişler (16 bit) kullanmak mümkün mü?
PHP, çoğu sistemde 32 bit olan PHP_INT_SIZE
baytlık depoları depolar. Tüm tamsayılar 2^16'dan küçüktür, yani short int (örneğin C) olabilir. Mürekkepleri kısa olarak saklamanın RAM'in yarısını alacağını düşünerek haklı mıyım?
İdeal yapabilmek istiyorum:
$s = (short) 1234; // takes up 2 bytes instead of 4
diğer bilgiler:
- dizi RAM 100mb hakkında kaplıyor ve dökümü var_export() bir 30MB dahil edilerek oluşturulan
- Dizi, bir cron işleminde yazılmıştır. Sadece okuma, bellek etkin (ve hızlı) olmalıdır
- Tamsayılar üzerinde yapmam gereken tek işlem hepsini karşılaştırıyor (<,>, ===) ve daha sonra bunlardan birkaçını okuyor. Floyd-Warshall algorithm)
- bir DB'den her değer okuma milyon birkaç yüz istek başına okur
Bazı çılgın fikirler olduğu gibi yol çok yavaş: Kullan pack()/unpack()
- ama bu, bunu yine mağaza 32 bi olarak değerleri Onlar bir görüntüdeki piksel olarak
- depola değerlerini çözdükten ve onları okumak için PHP'nin GD library kullanmak edildi t ints
- kullanın shmop_read() (bu yavaş olacaktır) ve Apache süreçler dizisini paylaşan var
- Memcached işe yarayabilecek ama onunla hiçbir deneyime sahip ve bunu
- yeniden derleyin PHP bir doğal PHP dizinin kat kat daha yavaş
- C öğrenin olmak ++ ve bir PHP uzantısı yazardı sanırım (ya HipHop?) ints
- kullanımı için 2 byte kullanarak Igbinary (kullanışlıdır, ancak paket() ile aynı problemi olacaktır)
kesinlikle shmop_ * işlevlerini kullanın ... bunun dışında BarsMonster ile aynı şeyi düşünebileceğimden başka. –
Mysql ve bellek tablolarını kullanamadığınızdan emin misiniz? Belki de php –
serileştirme ile seri veri göndermeyi önlemek için sorgu formundaki karşılaştırmaları bile yazabilir ve seri hale getirilmemiş var_export'dan daha hızlıdır, btw – raveren