PHP - * hızlı * serialize / unserialize?

8 Cevap php

Ben bir binary search tree a rather large CSV file (5MB +) üzerinde inşa bir PHP komut dosyası var. Bu güzel ve tüm, ama o / ayrıştırma / endekslemek dosyasını okumak için yaklaşık 3 saniye sürer.

Şimdi ben serialize() kullanabilir ve unserialize() sürecini hızlandırmak için düşündüm. CSV dosyası arada değişmedi, onu tekrar ayrıştırma hiçbir nokta yoktur.

Benim korku I unserialize() geri okumak için dayanılmaz 27 saniye sürer, oysa benim kütüğü nesne üzerinde serialize() çağırarak, 5 saniye sürer ve büyük (19MB) metin dosyası üretir bulabilirsiniz. Improvements biraz farklı görünüyor. ;-)

Yani - PHP diskten / konumuna geri / büyük nesne grafikleri depolamak için daha hızlı bir mekanizma var mı?

(Netleştirmek için: Ben de-serileştirme işi yapmak için yukarıda belirtilen 3 saniyeden daha significantly daha az sürer şey arıyorum.)

8 Cevap

Bu sorunun cevabı hayır gibi görünüyor.

Büyük olasılıkla bir "ikili seri hale getirme biçimi" seçeneği keşfetmek bile bile siz tasavvur ne için yavaş olacaktır.

Peki, (diğerleri de söylediğim gibi) kullanarak içine bakmak gerekebilir memcached, bir veritabanı, ya da online web hizmeti.

Ben de şu fikirleri eklemek istiyorum:

  • istekleri / yanıtların önbelleğe
  • PHP komut dosyası kapatma değil ama sorularına yanıt için bir ağ sunucusu olur
  • ya da, ben, şu anda kullandığınız veri yapısını ve sorgu yöntemini değiştirmek söylemek cesaret

Öncelikle programın çalışır şekilde değiştirmek zorundasınız. küçük parçalar CSV dosyasını bölmek. Bu i varsayalım bir IP veri deposu olduğunu. .

Uzun tamsayı ya da tüm IP adreslerine dönüştürmek.

So if a query comes you can know which part to look. There are <?php ip2long() /* and */ long2ip(); functions to do this. So 0 to 2^32 convert all IP addresses into 5000K/50K total 100 smaller files. This approach brings you quicker serialization.

Akıllı, kod düzenli ;) düşünüyorum

Ben burada iki seçenek göreceksiniz

gibi basit formu şey dize serileştirme,

  write => implode("\x01", (array) $node);
  read  => explode() + $node->payload = $a[0]; $node->value = $a[1] etc

paketi ile ikili serileştirme ()

  write => pack("fnna*", $node->value, $node->le, $node->ri, $node->payload);
  read  => $node = (object) unpack("fvalue/nre/nli/a*payload", $data);

Bu kriter iki seçeneği de ilginç olacaktır ve sonuçları karşılaştırmak istiyorsunuz.

Igbinary deneyin ... benim için harikalar yaptı:

http://pecl.php.net/package/igbinary

Hız istiyorsanız, yazma veya idealden daha az dosya sisteminden okuma.

Çoğu durumda, bir veritabanı sunucusu dosyaları yazma / okuma için bir PHP komut daha çok daha verimli veri depolamak ve almak mümkün olacak.

Başka bir olasılık Memcached gibi bir şey olurdu.

Nesne serileştirme performans için değil kullanım kolaylığı için bilinen değildir ve kesinlikle büyük miktarda veri işlemek için uygun değil.

SQLite PHP ile gelir, sizin veritabanı olarak kullanabilirsiniz. Aksi takdirde sadece ham PHP nesneyi kaydederken, o zaman bir şey getirilmeye yok, oturumları kullanarak deneyebilirsiniz.

Ne veri yükleme / depolamak için bir format için JSON gibi bir şey kullanmaya ne dersiniz? Ben JSON ayrıştırıcı PHP ne kadar hızlı olduğunu hiçbir fikrim yok, ama genellikle çoğu dilde hızlı bir işlemdir ve hafif bir biçimidir.

http://php.net/manual/en/book.json.php