2017-02-08 31 views
7

की तुलना में मैं एक काफी बड़े mysql तालिका, 30M के बारे में पंक्तियाँ, 6 कॉलम, 2GB के बारे में जब मेमोरी में लोड है एक बहुत लंबे समय लेता है।लोड हो रहा है mysql तालिका आर

मैं दोनों अजगर और आर आर में साथ काम करते हैं, मैं स्मृति में तालिका लोड कर सकते हैं और यह के बारे में 90 सेकंड लेता है। लेकिन अजगर में 40 मिनट लगते हैं।

मैं इसे दोनों SQLAlchemy के साथ और सादे pymysql साथ की कोशिश की है। कोड सीधा है, उदाहरण के लिए, SQLAlchemy के साथ:

db_engine = sqlalchemy.create_engine("mysql+pymysql://user:[email protected]/database") 
cnx = db_engine.connect() 
table = pd.read_sql('select * from my_table',cnx) 
cnx.close() 

SQLAlchemy के बिना:

cnx = mysql.connector.connect(**db_details) 
cursor = cnx.cursor() 
cursor.execute('select * from my_table') 
table = pd.DataFrame(data=list(cursor),columns = cursor.column_names) 
cnx.close() 

किसी भी तरह से, यह बहुत, अनुसंधान, जो मेरे लिए बहुत मतलब नहीं है की तुलना में काफी धीमी है। यह क्यों है, और इसे गति देने का कोई तरीका है? यहां तक ​​कि एक हैक भी करेगा।

जोड़ने के लिए, पांडा यह बहुत देर लेने के साथ कोई लेना देना नहीं है। दूसरे कोड स्निपेट में, अगर मैं इसे list(cursor) पर वापस लाने के बजाय इसे एक पांडा डेटाफ्रेम में डाल देता हूं, तो यह केवल (लंबे समय तक) लेता है।

संपादित करें पर: डीबी आर/अजगर के रूप में एक ही मशीन पर चल रहा है, तो सब कुछ प्रवाह के मामले में समान होना चाहिए।

आरआई में DBI उपयोग कर रहा हूँ, और आर कोड मैं का उपयोग करें (मूल रूप से) यह:

require(DBI) 
cnx <- dbConnect(dbDriver("MySQL"),dbname="database",username="user",password="pass",host="host") 
table <- dbGetQuery(cnx,"select * from my_table") 

******** यह संकल्प (अधिकतर) ********

मददगार टिप्पणियाँ, विशेष रूप से @roganjosh से के लिए धन्यवाद, यह प्रतीत होता है कि इस मुद्दे को डिफ़ॉल्ट mysql संबंधक बल्कि सी है, जो यह बहुत धीमी गति से बनाता से अजगर में लिखा है कि। समाधान MySQLdb का उपयोग करना है, जो मूल सी कनेक्टर है। क्योंकि MySQLdb केवल अजगर 2. में समर्थित है हालांकि

मेरी विशेष सेटअप में, एनाकोंडा के साथ अजगर 3 चल रहा है, यह संभव नहीं था, नाम mysqlclient तहत अजगर 3 के लिए MySQLdb के एक कार्यान्वयन है।

इस कार्यान्वयन का उपयोग करना अब पूरे टेबल को पढ़ने के लिए लगभग 5 मिनट तक है, आर जितना तेज़ नहीं है, लेकिन 40 से कम या इससे पहले कि यह पहले ले रहा था।

+0

मैं एक पांडा डेटाफ्रेम में रूपांतरण को अलग कर दूंगा लेकिन यह वास्तव में दिलचस्प है –

+0

अच्छा बिंदु, मैंने ऐसा किया। यह पांडा रूपांतरण नहीं है। बस पंक्तियों की सूची प्राप्त करने में लगभग 40 मिनट लगते हैं। – mrip

+0

क्या नेटवर्क शामिल है? क्या आप उसी डेटाबेस पर स्क्रिप्ट निष्पादित कर रहे हैं जैसे आपका डेटाबेस चालू है? – alecxe

उत्तर

1

विशेष रूप से @roganjosh से सहायक टिप्पणियों के लिए धन्यवाद, ऐसा लगता है कि मुद्दा यह है कि डिफ़ॉल्ट mysql कनेक्टर सी के बजाय अजगर में लिखा गया है, जो इसे बहुत धीमा कर देता है। समाधान MySQLdb का उपयोग करना है, जो मूल सी कनेक्टर है। क्योंकि MySQLdb केवल अजगर 2. में समर्थित है हालांकि

मेरी विशेष सेटअप में, एनाकोंडा के साथ अजगर 3 चल रहा है, यह संभव नहीं था, नाम mysqlclient तहत अजगर 3 के लिए MySQLdb के एक कार्यान्वयन है।

इस कार्यान्वयन का उपयोग करना अब पूरे टेबल को पढ़ने के लिए लगभग 5 मिनट तक है, आर जितना तेज़ नहीं है, लेकिन 40 से कम या इससे पहले कि यह पहले ले रहा था।

मैं अभी भी सुझाव है कि यह तेजी से होगा के लिए खुला है, लेकिन मेरा अनुमान है कि इस के रूप में अच्छा है के रूप में यह हो रहा है है।

0

एक शुद्ध सी/सी ++ ultramysql MySQL driver भी है जिसका उपयोग umysqldb adapter के साथ किया जा सकता है। परियोजनाएं सक्रिय नहीं हैं, लेकिन एक बार की बात के लिए उपयोग की जा सकती है - हालांकि मैं उत्पादन में उनका उपयोग नहीं करूँगा।

pymysql एक शुद्ध-पायथन ड्राइवर है, तो आप इसे PyPy पर चलाने का भी प्रयास कर सकते हैं।

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