2015-02-05 7 views
8

पर मेमोरी का उपयोग करता है मैं पोस्टग्रेस्क्ल डेटाबेस से पूछताछ करने के लिए psycopg2 का उपयोग कर रहा हूं और लगभग 380 एम पंक्तियों वाली तालिका से सभी पंक्तियों को संसाधित करने का प्रयास कर रहा हूं। केवल 3 कॉलम (आईडी 1, आईडी 2, गिनती) सभी प्रकार के पूर्णांक हैं। हालांकि, जब मैं नीचे सीधा चयन क्वेरी चलाता हूं, तो पायथन प्रक्रिया ओएस द्वारा मारने तक, अधिक से अधिक स्मृति का उपभोग शुरू करती है।Psycopg2 बड़े चयन क्वेरी

मिनिमल काम कर उदाहरण (यह मानते हुए कि mydatabase मौजूद है और एक मेज mytable कहा जाता है):

import psycopg2 
conn = psycopg2.connect("dbname=mydatabase") 
cur = conn.cursor() 
cur.execute("SELECT * FROM mytable;") 

इस बिंदु पर कार्यक्रम लेने वाली स्मृति शुरू होता है।

मुझे एक नज़र थी और पोस्टग्रेस्क्ल प्रक्रिया अच्छी तरह से व्यवहार कर रही है। यह सीपीयू का एक उचित बिट का उपयोग कर रहा है, जो ठीक है, और बहुत सीमित मात्रा में स्मृति है।

मैं psycopg2 को चयन से सभी परिणामों को बफर करने की कोशिश किए बिना एक इटरेटर वापस करने की उम्मीद कर रहा था। मैं फिर सभी पंक्तियों को संसाधित करने के लिए बार-बार cur.fetchone() का उपयोग कर सकता था।

तो, मैं उपलब्ध स्मृति का उपयोग किये बिना 380 एम पंक्ति तालिका से कैसे चयन करूं?

उत्तर

12

आप server side cursors का उपयोग कर सकते हैं।

cur = conn.cursor('cursor-name') # server side cursor 
cur.itersize = 10000 # how much records to buffer on a client 
cur.execute("SELECT * FROM mytable;") 
+0

ग्रेट, इसके लिए धन्यवाद! मैं थोड़ा सा स्पष्टीकरण सुधारने के लिए कुछ संपादन करने जा रहा हूं और फिर स्वीकार करता हूं। – Carl

+0

क्या यह कर्सर PostgreSQL-server या पायथन-क्लाइंट में मौजूद है? चयन के लिए कर्सर_नाम कर्सर * Mytable से; –

+0

@ फ्रैंकहेइकेंस इस मामले में पाइथन क्लाइंट साइड से सबकुछ किया जाता है। कोई कर्सर सर्वर पक्ष मौजूद नहीं है। – Carl

0

एक और तरीका है सर्वर साइड कर्सर का उपयोग करें:

with psycopg2.connect(database_connection_string) as conn: 
    with conn.cursor(name='name_of_cursor') as cursor: 

     cursor.itersize = 20000 

     query = "SELECT * FROM ..." 
     cursor.execute(query) 

     for row in cursor: 
      # process row 

Psycopg2 एक समय में ग्राहक के लिए itersize पंक्तियों लायेगा। एक बार for बैच निकास जो बैच, यह अगले को लाएगा।

संबंधित मुद्दे