Django

2011-04-13 22 views
6

'daki büyük veri kümelerinin yinelemesini nasıl hızlandırabilirim Django ORM sorgusundan yaklaşık 1500 kayıtlı bir sorgu kümem var. Sorgunun sıkı olduğundan emin olmak için select_related() ve only() yöntemlerini kullandım. Sadece bu bir sorgu olduğundan emin olmak için connection.queries kullandım. Yani, her yineleme için fazladan sorgunun yapılmadığından emin oldum.Django

Sorguyu çalıştırdığınızda, connection.queries uygulamasından kes ve yapıştır işlemi 0,02 saniyede çalışır. Ancak, bu kayıtlar üzerinde yinelemek ve onlarla hiçbir şey yapmamak yedi saniye sürüyor (pass).

Bunu hızlandırmak için ne yapabilirim? Bu yavaşlığa neden olan nedir?

+0

Modelleriniz ve sorgunuz hakkında daha fazla ayrıntı eklemelisiniz! –

+4

Ayrıca Django

cevap

14

Bir QuerySet, model nesneleri dolu olduğunda oldukça ağır olabilir. Benzer durumlarda, sözlüklerin bir listesi olarak ihtiyacım olan özellikleri belirtmek için queryset üzerinde .values ​​yöntemini kullandım. Bu, yineleme için çok daha hızlı olabilir.

+1

Sen haklıydın. Her iterasyonda model nesnelerin ortaya çıkması, çok fazla yüke neden oluyordu. Değerler yöntemini kullanmak, kümenin yinelemesini yedi saniyeden birkaç milisaniyeye düşürdü. – stinkypyper

+1

Müthiş. Sevindim, yardım edebildim. – Brandon

+0

Bunun ile büyük bir performans artışı farkettim! Tamamlamak için neredeyse 70 saniye süren 110000 parçadan oluşan bir test hazırlıyordum. Aynı değerlerin listelenmesi 5 saniye sürdü! – ninapavlich

2

1500 kayıtları büyük bir veri kümesi olmaktan çok uzaktır ve yedi saniye gerçekten çok fazladır. Modellerinizde büyük olasılıkla bir problem vardır, bunu Brandon'ın değerlerini() belirttiği gibi() yazarak kontrol edebilir ve sonra da sözlüğü yineleyerek 1500 nesnesini oluşturabilirsin. Yapmadan önce ValsQuerySet'i db bağlantısını dışlamak için bir listeye dönüştürün. , Doc göre iterator() her

for item in items: 
    print item 

üzerinde döngü

items = SomeModel.objects.all() 

Düzenli Veya Sorgu Kümesi iterator

for item in items.iterator(): 
    print item 

kullanarak:

2

Nasıl her öğe üzerinde yineleme vardır performansı artırabilir. Aynı şey çok büyük Python listesi veya sözlükleri döngü yaparken geçerlidir, iteritems()'u kullanmak en iyisidir.

+0

Bunun işe yarayıp yaramadığını bilmiyorum, çünkü çoğunlukla yineleme şablonda yapılır ve burada .iterator() 'a sahip olup olmadığından emin değilim. – sprezzatura

+0

Ben kontrol ettim ve aslında çalışıyor. For döngüsünü çok hızlandırın. 0: 00: 45.550635'den 0: 00: 09.761178'e kadar, en az 4 kat daha hızlı! –

1

Modelinizin Meta beyanı, diğer ilgili tabloda saklanan bir alanı "sipariş ederek" anlatıyor mu? Eğer öyleyse, yineleme girişimi Django kaçtığında 1.500 sorguyu tetikleyebilir ve her bir öğe için bu alanı alır ve sonra bunları sıralar. Kodunuzu göstermeniz sorunu çözmemize yardımcı olur!