नैट सी करीब था, लेकिन काफी नहीं।
डॉक्स से:
<ब्लॉकक्वॉट>आप क्वेरीसेट का मूल्यांकन निम्न तरीकों से कर सकते हैं:
-
पुनरावृत्ति। एक QuerySet चलने योग्य है, और जब आप पहली बार इस पर पुनरावृति करते हैं तो यह अपनी डेटाबेस क्वेरी को निष्पादित करता है। उदाहरण के लिए, यह डेटाबेस में सभी प्रविष्टियों का शीर्षक प्रिंट करेगा:
for e in Entry.objects.all(): print e.headline
तो जब आप पहली बार उस लूप में प्रवेश करते हैं और क्वेरीसेट का पुनरावृत्त रूप प्राप्त करते हैं, तो आपकी दस मिलियन पंक्तियां पुनर्प्राप्त की जाती हैं। आपके द्वारा अनुभव की जाने वाली प्रतीक्षा है कि Django डेटाबेस पंक्तियों को लोड कर रहा है और प्रत्येक के लिए ऑब्जेक्ट बना रहा है, कुछ वापस करने से पहले आप वास्तव में फिर से शुरू कर सकते हैं। तब आपके पास सब कुछ स्मृति में होता है, और परिणाम सामने आ जाते हैं।
डॉक्स के मेरे पढ़ने से, iterator()
क्वेरीसेट के आंतरिक कैशिंग तंत्र को बायपास करने के अलावा और कुछ नहीं करता है। मुझे लगता है कि यह एक-एक करके काम करने के लिए समझ में आ सकता है, लेकिन इसके विपरीत आपके डेटाबेस पर दस मिलियन व्यक्तिगत हिट की आवश्यकता होगी। शायद यह सब वांछनीय नहीं है।
बड़े डेटासेट पर कुशलतापूर्वक पुनरावृति करना कुछ ऐसा है जिसे हम अभी भी पूरी तरह से ठीक नहीं कर पाए हैं, लेकिन कुछ ऐसे स्निपेट हैं जो आपको अपने उद्देश्यों के लिए उपयोगी लग सकते हैं:
- स्मृति कुशल Django QuerySet iterator
- बैच क्वेरीसेट
- क्वेरीसेट फॉर्च्यूनर