PHP Döngü Performans Optimizasyonu

4 Cevap php

Ben (bir MySQL veritabanı veya düz dosya olması) bu veri çekme, işaretçiler bir dizi üzerinde ve her öğe için döngü gereken bir PHP işlevini yazıyorum. Potansiyel yineleme binlerce ve binlerce olabilir gibi herkes bu optimize herhangi bir fikir var mıydı?

Benim ilk fikir üzerinde çalışmak ve herhangi bir değişiklik sadece sonunda ben diske temizleyebilirsiniz o önbelleğe dizisini değiştirmek önbelleğe alınan veriler statik bir dizi sahip oldu. Ben sadece dizide 30 civarında tutmak Ancak 1000 öğeleri bir döngü içinde, bu yararsız olacaktır. Her madde çok büyük değil ama bellekte bunların 1000 + disk depolama dolayısıyla ihtiyaç, yol çok fazla.

Veri sadece tefrika nesneleri gzip'lenmiş. Şu anda veri depolamak için bir veritabanı kullanıyorum ama belki düz dosyalar (I eşzamanlılık sorunları umurumda değil ve ben bunu ayrıştırmak gerek yok, sadece halletmek ve unserialize) daha hızlı olacağını düşünüyorum. Zaten bir seferde 5 ürün çekme (DB bağlantıları azaltmak için) ve bu önbellek saklayabilirsiniz olacak özel bir yineleyici var. Fakat yine de, ben binlerce tekrarlatacak gerektiğinde 30 bir önbellek kullanarak oldukça gereksiz olduğunu.

Temelde sadece hızlı bir şekilde bu çok öğe üzerinde yineleme için bir yol gerekir.

4 Cevap

Peki, sen gitmek için bir sürü verilmiş değil. Verilerinizi tarif yoktur ve veri ne yaptığını açıklamak yoksa veya başka karşı, ve bu nesneler geçici olarak serbest olsun, nasıl ve ne şartlar altında bunu geri istiyorum, ve gibi tek bir nesneyi gerektiğinde .. .

Yani bir şey herkes karanlıkta tam bir çekim olacak yazıyor.

... Bu nedenle bu doğrultuda, burada karanlık bir çekim var.

Eğer x öğeler için yer ayırmak herhangi bir anda bellekte sadece rahat tutma x öğeler, iseniz. Sonra nesneye erişmek her zaman, (Bu, onlara erişmek sırayı anlamına gelebilir gibi saat zaman çok anlamı olmayabilir) bir zaman not edin. En son kullanılan öğeler listesinde er görünür ki (o değil, bir yığın benzeri bir yapı olarak, bir listede uygulanabilir olmayabilir) bir listedeki her bir öğeyi tutun. Eğer belleğe bir yenisini koymak gerektiğinde, önce uzun süre kullanılan bir yerine ve ardından listenin önüne bu öğeyi taşıyın. Eğer ihtiyacınız olduğunda tam olarak listede nerede biliyor böylece başka öğeler endeksi tutmak gerekebilir. O zaman ne madde bulunduğu, listenin önüne taşımak, sonra uygun olarak ana ve çocuk işaretçileri bağlantı yukarı bakmak. Arama süresini optimize etmek için başka yollar da, muhtemelen vardır.

Bu LRU algroithm olarak adlandırılır. Bu sanal bellek için bir sayfa değiştirme düzeni bulunuyor. Ne yapar bunu önlemek için muhtemelen imkansız kadar bu darboğaz (disk I / O) geciktirir olduğunu. Bu algoritma optimum değiştirme garanti etmez fazlalaştı, ama yine de oldukça iyi bir performans sergiliyor.

Bir öğe yüklemek veya dökümü sabit disk vurmak gerektiğinde, gerçek işi meşgul olduğunu işlemci tutmak böylece bunun ötesinde, ben bir büyük ölçüde (eğer mümkünse) kodunuzu parallelizing öneriyoruz.

< edit > Based off of your comment, you are working on a neural network. In the case of your initial fedding of the data (before the correction stage), or when you are actively using it to classify, I don't see how the algorithm is a bad idea, unless there is just no possible way to fit the most commonly used nodes in memory.

Düzeltme aşamasında (belki de arka-prop?), Bu zaten onları ziyaret ettik çünkü ... hafızada tutmak ZORUNLU ne düğümler belirgin olmalı!

If your network is large, you aren't going to get away with no disk I/O. The trick is to find a way to minimize it. < /edit >

Açıkçası, bellekte tutmak başka bir şey daha hızlıdır. Her madde ne kadar büyük? Onlar bile bunların 1K her biri, on bin sadece 10 M. olduğunu

Eğer ihtiyacınız verileri almak sonra her zaman bir döngü üzerinde patlak verebilir. Bu döngü devam olmaz ki. Eğer depolamak düz bir dosya ise .. size sunucu HDD farklı dosya boyutu ile dosyaların binlerce veya milyonlarca içeren yaşayacaktır. Ama bir veritabanında saklanan tüm gerçek dosya bahsediyoruz. o bir klasörde saklayın ve sadece DB o dosyanın yolunu kaydetmek için çok daha iyidir. Ve bir XML çekti öğeleri koyarak deneyin. Bu öğenin ayrıntılar için birçok niteliklerine erişmek için ve o içerebilir çok daha kolay olduğunu bu nedenle örneğin (İsim, tarih tarih, vb) çekildi.

Sen sonraki çağrılarda önbelleğe alınmış sürümünü kullanın, sonra okudukları ilk defa nesneleri saklamak için memcached kullanabilirsiniz. Yani sürece yeterli belleğe sahip nesneleri depolamak için RAM kullanmak memcached, büyük bir accceleration olacak. Memcached için bir php api var