2010-10-18 7 views
7

मैं डेटा पंक्ति को पंक्ति से बचाने के लिए पायथन का उपयोग कर रहा हूं ... लेकिन यह बेहद धीमा है!एक CSV फ़ाइल को Sqlite3 (या MySQL) में माइग्रेट कैसे करें? - पायथन

सीएसवी 70million लाइनों शामिल है, और मेरी स्क्रिप्ट साथ मैं सिर्फ एक दूसरे 1thousand स्टोर कर सकते हैं।


यह

तरह
reader = csv.reader(open('test_results.csv', 'r')) 
for row in reader: 
    TestResult(type=row[0], name=row[1], result=row[2]).save() 

मुझे लगता है कि मैं MySQL या PostgreSQL विचार करने के लिए हो सकता है परीक्षण के लिए मेरी स्क्रिप्ट दिखाई देता है।

कोई विचार या सुझाव? यह पहली बार है जब मैं डेटा की इतनी भारी मात्रा से निपटता हूं। :)

+0

वर्गमीटर mysql से धीमा है। mongoDB आमतौर पर सम्मिलन के लिए तेज़ है, भले ही इसमें अन्य सीमाएं हैं –

+0

'TestResult' क्या है? आपने sqlite3 को कोई वास्तविक कॉल नहीं दिखाया है, इसलिए कोड पर टिप्पणी करना थोड़ा मुश्किल है। यदि आप 'सेव()' छोड़ते हैं और फिर यदि आप टेस्ट रेसल्ट निर्माण को 'पास' से बदलते हैं तो बेसलाइन रीडिंग टाइम क्या है? –

+0

टेस्ट्रेसल्ट एक Django ORM का मॉडल सबक्लास – RadiantHex

उत्तर

3

मैं अगर यह एक बड़ा पर्याप्त अंतर कर देगा पता नहीं है, लेकिन आप के बाद से ' Django ORM से निपटने के बाद मैं निम्नलिखित का सुझाव दे सकता हूं:

  1. सुनिश्चित करें कि DEBUG आपकी Django सेटिंग्स फ़ाइल में गलत है, अन्यथा आप स्मृति में प्रत्येक क्वेरी को संग्रहीत कर रहे हैं।
  2. अपने तर्क को मुख्य फ़ंक्शन में रखें, और django.db.transactions.commit_on_success सजावट में लपेटें। इससे प्रत्येक पंक्ति को अपने लेन-देन की आवश्यकता से रोका जा सकता है, जो प्रक्रिया को काफी तेज़ी से बढ़ाएगा।
  3. यदि आप जानते हैं कि फ़ाइल में सभी पंक्तियां डेटाबेस में मौजूद नहीं हैं, तो save_insert = save() विधि में अपने कॉल के लिए सही जोड़ें। इससे स्क्लाइट की आवश्यकता के लिए कॉल की संख्या कम हो जाएगी।

यदि आप क्लाइंट-सर्वर डीबीएमएस का उपयोग करके स्वयं को पाते हैं तो ये सुझाव शायद एक बड़ा अंतर भी बनाएंगे।

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