सर्वर साइड कर्सर के साथ काम करने के लिए Psycopg2 में एक अच्छा इंटरफ़ेस है। यह उपयोग करने के लिए एक संभावित टेम्पलेट है:
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
उपरोक्त कोड कनेक्शन बनाता है और स्वचालित रूप से क्वेरी परिणाम को सर्वर साइड कर्सर में रखता है। मान itersize
सर्वर साइड कर्सर से एक बार में क्लाइंट द्वारा खींची जाने वाली पंक्तियों की संख्या सेट करता है। आपके द्वारा उपयोग किए जाने वाले मान को क्लाइंट पर नेटवर्क कॉल बनाम मेमोरी उपयोग की संख्या को संतुलित करना चाहिए। उदाहरण के लिए, यदि आपके परिणाम की संख्या तीन मिलियन है, तो एक itersize
2000 का मान (डिफ़ॉल्ट मान) के परिणामस्वरूप 1500 नेटवर्क कॉल होंगे। यदि 2000 पंक्तियों द्वारा खपत की गई मेमोरी हल्की है, तो उस संख्या को बढ़ा दें।
for row in cursor
. का उपयोग करते समय बेशक आप एक समय में एक पंक्ति के साथ काम कर रहे हैं, लेकिन Psycopg2 itersize
प्रीफ़ेच करेगा आपके लिए एक बार में पंक्तियाँ।
अगर आप fetchmany
. का इस्तेमाल करना चाहते हैं किसी कारण से, आप ऐसा कुछ कर सकते हैं:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
fetchmany
. का यह उपयोग जब तक प्रीफ़ेच किया गया बैच समाप्त नहीं हो जाता, तब तक अधिक पंक्तियों के लिए सर्वर पर नेटवर्क कॉल को ट्रिगर नहीं करेगा। (यह एक जटिल उदाहरण है जो उपरोक्त कोड पर कुछ भी नहीं प्रदान करता है, लेकिन दर्शाता है कि fetchmany
का उपयोग कैसे करें आवश्यकता होनी चाहिए।)