2009-11-27 10 views
27

मुझे एक बड़े परिणाम सेट से निपटना होगा (सैकड़ों हजारों पंक्तियां हो सकती हैं, कभी-कभी अधिक)।
दुर्भाग्यवश दुर्भाग्य से सभी को एक बार में शुरू करने की आवश्यकता है (स्टार्ट अप पर)।कुशलता से MySQLDB SScursor का उपयोग कैसे करें?

मैं जितना संभव हो उतना कम स्मृति उपयोग करके ऐसा करने की कोशिश कर रहा हूं।
एसओ को देखकर मैंने पाया है कि SSCursor का उपयोग करके मैं जो खोज रहा हूं, लेकिन मुझे अभी भी वास्तव में पता नहीं है कि उन्हें वास्तव में कैसे उपयोग किया जाए।

आधार कर्सर से fetchall() या एक एसएसकर्सर (स्मृति उपयोग की अवधि में) कर रहा है?
क्या मैं अपनी पंक्तियों को एक-एक करके (या कुछ से कुछ) एसएससीसर से 'स्ट्रीम' कर सकता हूं और यदि हां,
ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

28

मैं ओटो ALLMENDINGER के जवाब के साथ समझौते में हूँ, लेकिन स्पष्ट डेनिस Otkidach की टिप्पणी करने के लिए, आपके द्वारा ओटो के लाने() फ़ंक्शन का उपयोग किए बिना परिणामों पर पुनरावृति कर सकते हैं: वैकल्पिक रूप से

import MySQLdb.cursors 
connection=MySQLdb.connect(
    host="thehost",user="theuser", 
    passwd="thepassword",db="thedb", 
    cursorclass = MySQLdb.cursors.SSCursor) 
cursor=connection.cursor() 
cursor.execute(query) 
for row in cursor: 
    print(row) 
+0

मुझे लगता है कि मैं जो खोज रहा था, धन्यवाद – Sylvain

+0

क्या यह एक-एक करके पंक्तियों को लाता है? यदि नहीं, तो यह एक बार में कितनी पंक्तियां लाता है। मेरे पास 37 मिलियन से अधिक रिकॉर्ड के साथ एक डीबी है। मुझे रिकॉर्ड एक-एक करके पढ़ने की ज़रूरत है और उन्हें एक फाइल में डाल देना है (कुछ अतिरिक्त चीजों के साथ, इसलिए एक साधारण डंप नहीं हो सकता है)। क्या यह किसी भी तरह समानांतर में किया जा सकता है। उदाहरण के लिए मैं 10000 पंक्तियां उन्हें लिखता हूं और जब मैं उन्हें लिखता हूं तो कुछ पंक्तियां प्राप्त की जा रही हैं और इसी तरह .. – Sohaib

+0

@ सोहाइब: यह एक समय में एक पंक्ति लाती है। यदि आपकी समस्या सीपीयू-बाध्य है, तो आप एकाधिक डीबी पाठकों को स्थापित करने के लिए मल्टीप्रोसेसिंग (पायथन 2/3) या समवर्ती। फ़्यूचर्स (पायथन 3 में) का उपयोग कर सकते हैं, लेकिन आपको केवल एक लेखक को फ़ाइल में उपयोग करना चाहिए, अन्यथा रिकॉर्ड प्राप्त होंगे विकृत। [यदि आपकी समस्या आईओ-बाध्य है] (http://eli.thegreenplace.net/2012/01/16/python-parallelizing-cpu-bound-tasks-with-multiprocessing/) - अगर फ़ाइल में लिखना है बाधा - फिर एकाधिक पाठकों की स्थापना नौकरी को तेज नहीं करेगी। – unutbu

9

बड़े परिणाम सेट प्राप्त करते समय निश्चित रूप से एसएससीसर का उपयोग करें। जब मुझे एक ही समस्या थी तो इससे मेरे लिए एक बड़ा अंतर आया। आप इसे इस तरह का उपयोग कर सकते हैं:

import MySQLdb 
import MySQLdb.cursors 

connection = MySQLdb.connect(
     host=host, port=port, user=username, passwd=password, db=database, 
     cursorclass=MySQLdb.cursors.SSCursor) # put the cursorclass here 
cursor = connection.cursor() 

अब आप cursor.execute() साथ आपकी क्वेरी निष्पादित और पुनरावर्तक के रूप में कर्सर का उपयोग कर सकते हैं।

संपादित करें: अनावश्यक घरगुती इटरेटर हटा दिया, धन्यवाद डेनिस!

+3

कर्सर ऑब्जेक्ट इज़ेबल है, इसलिए इसके ऊपर जनरेटर लिखने की आवश्यकता नहीं है। अन्यथा आप 'iter (कर्सर.फेटचोन, कोई नहीं) 'का उपयोग कर सकते हैं। –

0

, तो आप उपयोग कर सकते हैं SSCursor कनेक्शन ऑब्जेक्ट के बाहर (यह बहुत महत्वपूर्ण है जब आप कनेक्शन को पहले ही परिभाषित करते हैं और नहीं चाहते कि सभी कनेक्शन SSCursor को कर्सरक्लास के रूप में उपयोग करें)।

import MySQLdb 
from MySQLdb.cursors import SSCursor # or you can use SSDictCursor 

connection = MySQLdb.connect(
     host=host, port=port, user=username, passwd=password, db=database) 
cursor = SSCursor(connection) 
cursor.execute(query) 
for row in cursor: 
    print(row) 
संबंधित मुद्दे