PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक बड़े Django QuerySet के माध्यम से बड़ी मात्रा में स्मृति का उपभोग क्यों कर रहा है?

नैट सी करीब था, लेकिन काफी नहीं।

डॉक्स से:

<ब्लॉकक्वॉट>

आप क्वेरीसेट का मूल्यांकन निम्न तरीकों से कर सकते हैं:

  • पुनरावृत्ति। एक QuerySet चलने योग्य है, और जब आप पहली बार इस पर पुनरावृति करते हैं तो यह अपनी डेटाबेस क्वेरी को निष्पादित करता है। उदाहरण के लिए, यह डेटाबेस में सभी प्रविष्टियों का शीर्षक प्रिंट करेगा:

    for e in Entry.objects.all():
        print e.headline
    

तो जब आप पहली बार उस लूप में प्रवेश करते हैं और क्वेरीसेट का पुनरावृत्त रूप प्राप्त करते हैं, तो आपकी दस मिलियन पंक्तियां पुनर्प्राप्त की जाती हैं। आपके द्वारा अनुभव की जाने वाली प्रतीक्षा है कि Django डेटाबेस पंक्तियों को लोड कर रहा है और प्रत्येक के लिए ऑब्जेक्ट बना रहा है, कुछ वापस करने से पहले आप वास्तव में फिर से शुरू कर सकते हैं। तब आपके पास सब कुछ स्मृति में होता है, और परिणाम सामने आ जाते हैं।

डॉक्स के मेरे पढ़ने से, iterator() क्वेरीसेट के आंतरिक कैशिंग तंत्र को बायपास करने के अलावा और कुछ नहीं करता है। मुझे लगता है कि यह एक-एक करके काम करने के लिए समझ में आ सकता है, लेकिन इसके विपरीत आपके डेटाबेस पर दस मिलियन व्यक्तिगत हिट की आवश्यकता होगी। शायद यह सब वांछनीय नहीं है।

बड़े डेटासेट पर कुशलतापूर्वक पुनरावृति करना कुछ ऐसा है जिसे हम अभी भी पूरी तरह से ठीक नहीं कर पाए हैं, लेकिन कुछ ऐसे स्निपेट हैं जो आपको अपने उद्देश्यों के लिए उपयोगी लग सकते हैं:

  • स्मृति कुशल Django QuerySet iterator
  • बैच क्वेरीसेट
  • क्वेरीसेट फॉर्च्यूनर


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL में डबल कोलन (::) नोटेशन

  2. Postgresql पर शीर्षकों के साथ तालिका को CSV के रूप में कैसे निर्यात करें?

  3. एन्कोडिंग UTF8 लोकेल en_US से मेल नहीं खाता; चुनी गई LC_CTYPE सेटिंग के लिए LATIN1 एन्कोडिंग की आवश्यकता होती है

  4. पीजी ::डुप्लीकेटटेबल:त्रुटि:संबंध पोस्ट पहले से मौजूद हैं

  5. सम्मिलित नहीं किया जा सकता:त्रुटि:सरणी मान { या आयाम जानकारी . से प्रारंभ होना चाहिए