2011-04-13 7 views
6

में बड़े डेटासेट के पुनरावृत्ति को कैसे बढ़ा सकता हूं मेरे पास Django ORM क्वेरी से लगभग 1500 रिकॉर्ड्स का एक क्वेरी सेट है। मैंने यह सुनिश्चित करने के लिए select_related() और केवल() विधियों का उपयोग किया है कि क्वेरी कसकर है। मैंने यह सुनिश्चित करने के लिए कनेक्शन.क्विरीज़ का भी उपयोग किया है कि केवल यह एक प्रश्न है। यही है, मैंने सुनिश्चित किया है कि प्रत्येक पुनरावृत्ति पर कोई अतिरिक्त प्रश्न नहीं उठाए जा रहे हैं।मैं Django

जब मैं क्वेरी से क्वेरी काट और पेस्ट चलाता हूं। यह 0.02 सेकेंड में चलता है। हालांकि, उन अभिलेखों को फिर से चलाने में सात सेकंड लगते हैं और उनके साथ कुछ भी नहीं करते (पास)।

इसे गति देने के लिए मैं क्या कर सकता हूं? इस धीमी गति का कारण क्या है?

+0

आपको अपने मॉडल और क्वेरी के बारे में अधिक जानकारी शामिल करनी चाहिए! –

+4

आपको Django लिखना चाहिए <- इस तरह :) वह एक गिटारवादक था, डीजे –

उत्तर

14

मॉडल ऑब्जेक्ट्स से भरा होने पर एक क्वेरीसेट बहुत भारी हो सकता है। इसी तरह की परिस्थितियों में, मैंने क्वेरीज़ पर .values ​​विधि का उपयोग उन गुणों को निर्दिष्ट करने के लिए किया है जिन्हें मुझे शब्दकोशों की सूची के रूप में आवश्यक है, जो कि फिर से शुरू करने के लिए बहुत तेज़ हो सकते हैं। http://docs.djangoproject.com/en/1.3/ref/models/querysets/#values-list

+1

आप सही थे। यह पता चलता है कि प्रत्येक पुनरावृत्ति पर मॉडल ऑब्जेक्ट्स का तात्कालिकता बहुत अधिक ओवरहेड पैदा कर रहा था। मूल्य विधि का उपयोग करके सेट के पुनरावृत्ति को सात सेकंड से नीचे कुछ मिलीसेकंड तक ले लिया गया। – stinkypyper

+1

बहुत बढ़िया। खुशी है कि मैं मदद करने में सक्षम था। – Brandon

+0

मैंने इस के साथ एक बड़ा प्रदर्शन वृद्धि देखी! मैं 110000 वस्तुओं की एक क्वेरीसेट को फिर से शुरू कर रहा था, जो पूरा होने में लगभग 70 सेकंड लग गए। उसी वैल्यू_लिस्ट को इटरेट करने में 5 सेकंड लग गए! – ninapavlich

2

1500 रिकॉर्ड एक बड़े डेटासेट होने से बहुत दूर है, और सात सेकंड वास्तव में बहुत अधिक है। शायद आपके मॉडल में कुछ समस्या है, आप इसे आसानी से (ब्रांडेन कहते हैं) मान() क्वेरी के द्वारा जांच सकते हैं, और फिर शब्दकोश को फिर से शुरू करके स्पष्ट रूप से 1500 ऑब्जेक्ट बना सकते हैं। डीबी कनेक्शन को कारक बनाने के लिए निर्माण से पहले ValuesQuerySet को एक सूची में कनवर्ट करें। प्रत्येक

for item in items: 
    print item 

पर पाश के लिए

items = SomeModel.objects.all() 

नियमित या क्वेरीसमूह iterator

for item in items.iterator(): 
    print item 

का उपयोग कर दस्तावेज़ के अनुसार, iterator():

2

कैसे आप प्रत्येक आइटम पर पुनरावृत्ति कर रहे हैं प्रदर्शन में सुधार कर सकते हैं। बहुत बड़ी पायथन सूची या शब्दकोशों को लूप करते समय भी वही लागू होता है, iteritems() का उपयोग करना सबसे अच्छा है।

+0

मुझे यकीन नहीं है कि यह काम करेगा, क्योंकि ज्यादातर टेम्पलेट टेम्पलेट में किया जाता है और मुझे यकीन नहीं है कि हमारे पास .iterator() है या नहीं। – sprezzatura

+0

मैंने इसे चेक किया है और यह वास्तव में काम कर रहा है। लूप के लिए बहुत तेज करें। 0: 00: 45.550635 से 0: 00: 09.761178, तो कम से कम 4 गुना तेज !!! –

1

क्या आपके मॉडल की Meta घोषणा यह किसी अन्य संबंधित तालिका में संग्रहीत फ़ील्ड द्वारा "ऑर्डर" करने के लिए कहती है? यदि ऐसा है, तो पुन: प्रयास करने का आपका प्रयास 1,500 प्रश्नों को ट्रिगर कर सकता है क्योंकि Django प्रत्येक आइटम के लिए उस क्षेत्र को पकड़ता है और उसे पकड़ता है, और फिर उन्हें टाइप करता है। हमें दिखा रहा है कि आपका कोड हमें समस्या को सुलझाने में मदद करेगा!