Veritabanından satır bir dizi yinelemeli algoritması uygulanması

7 Cevap php

Bu soru bazı çok temel görünebilir, ancak lütfen ayı olabilir ben iyi veritabanı programlama ele yana, bir süre oldu.

Ben bir web sitesi üzerinde çalışmak için PHP / MySQL programlamak için gereken bir algoritma var. Bu nesnelerin (kendi özelliklerine dayanarak nesneleri sırada) bir dizi üzerinde iteratif bazı hesaplamalar gerçekleştirir. Her tekrarında algoritma tüm koleksiyonu farklı yerlerden gelen çeşitli veri erişim, tüm koleksiyonu ile birkaç kez çalışır. Algoritma tamamlanması için birkaç yüz yineleme gerekmektedir. Dizi bir veritabanından geliyor.

Gördüğüm basit çözüm, bir veritabanı sorgu sonuçlarını almak ve sorgu her satır için bir nesne oluşturmak, bir dizi nesneleri koymak ve benim algoritması dizi geçmektir.

Ne yapmam aslında belleğe bir sorgunun sonuçlarını yansıtmak çünkü öğelerin birkaç bin bir dizi ile çalışmak zorunda Ancak, ben böyle bir çözümün etkinliği ile ilgili değilim.

Öte yandan, algoritmanın her tekrarında veritabanı sorgu birkaç kez yapmak da yanlış görünüyor.

Yani, benim soru - böyle bir sorun için doğru mimari çözüm nedir? Bu bellek sorgu sonuçlarını yansıtmak için Tamam mı? Değilse, hangi böyle bir algoritmada sorgu sonuçları ile çalışmak için en iyi yolu nedir?

Teşekkürler!

UPDATE: Aklıma yakın sorunu bir arama motoru tarafından arama sonuçlarının sıralamasını - Ben buna benzer bir şey yapmak gerekiyor. Her sonuç bir veritabanı bir satır olarak gösterilir ve rütbe hesaplanan zaman kümesinin tüm sonuçları kabul edilmektedir.

7 Cevap

Bellek gitmek için en iyi yol gibi görünüyor - bunu karşılayacak kadar ölçeklendirilebilir iff. Bir birleştirme sıralaması gibi bir şey yapmak - Aksi takdirde belki bir bölme kullanmak ve yaklaşım türünü fethetmek için algoritma revize etmek gerekecek.

Prematüre optimizasyonu tüm kötülüklerin köküdür, unutmayın. O belleğe her şeyi kopyalama bir şans verin. Çok fazla mem kullanıyorsa, daha sonra bellek için optimize.

Gerçekten eldeki duruma bağlıdır. Bu muhtemelen nadiren böyle bir şey yapmak için gerekli, ancak bu verdiğiniz bilgilerin kapalı tabanlı anlatmak çok zor oluyor.

Verisini mümkün olduğunca izole etmek için çalışın. Eğer döngü yineleme arasında data bağımlılıklarını yok veriler üzerinde bazı bağımsız bir eylemi gerçekleştirmek için gerekiyorsa Örneğin, yerine sadece onları geri yazmak için, belleğe hepsini yüklemek yerine etkilenen satırları güncelleştirmek için bir sorgu yazabilirsiniz .

Kısacası, muhtemelen önlenebilir ama bize daha fazla bilgi verebilir kadar söylemek zor :)

Eğer sonuç gel veritabanına bir sorgu yapıyorsanız, zaten "belleğe aynalı" vardır. Eğer mysql_fetch_assoc (veya eşdeğer) kullanarak sonuç almak zaman size kopyası var. Sadece önbellek olarak kullanmayın.

Bir nesnenin hesaplama başka bağlıdır, yoksa hepsi bağımsız? Onlar bağımsız iseniz, size açıklamak gibi nesnelere dönüştürerek, veritabanından satır sadece küçük bir sayıda yük olabilir. Sonra bu blok için daha sonra bu tekrarlamalar yüzlerce, ve çıkış sonucu çalıştırın. Daha sonra öğelerin sonraki blok geçin.

Bu, yalnızca öğelerin küçük bir sayı yerine tüm veri seti ile ilgileniyor beri, aşağı bellek kullanımını tutar, ve veritabanı üzerinde birden fazla sorguları çalışan önler.

SQL kelimeleri LİMİT ve OFFSET Eğer bloğu tarafından veri bloğunun adım adım yardımcı olabilir.

MySQL ile sıralaması sorguları yazarken de mümkündür, sadece kullanıcı tanımlı değişkenleri biraz oynamak gerekiyor. Bazı giriş verileri ve size ulaşmak için gidiyoruz sonuç sağlayacaktır eğer, yanıt daha detaylı olacak

Eğer sıralama yapmak için bir cron işi kullanabilirsiniz, bir kez gün, saat, ya da ne olursa olsun ihtiyaç başına söylemek ve sonra da aralıksız bir alana sıralamasında öğeleri kaydetmek?

Eğer sadece sıralama alanına göre bunları sipariş yukarı satırları dediğimiz yol.