2011-01-18 9 views
6

मेरे पास एक .sql फ़ाइल है जिसमें हजारों व्यक्तिगत सम्मिलन विवरण हैं। यह सब कुछ करने के लिए हमेशा के लिए लेता है। मैं इसे और अधिक कुशलता से करने का एक तरीका समझने की कोशिश कर रहा हूं। पायथन में sqlite3 लाइब्रेरी ".read" या ".import" जैसी चीजें नहीं कर सकती है लेकिन कई प्रविष्टियों के लिए executescript बहुत धीमी है।पायथन और एसक्लाइट 3 - हजारों पंक्तियों को जोड़ना

मैंने ".read" या ".import" का उपयोग करने की उम्मीद में sqlite3.exe खोल स्थापित किया है, लेकिन मैं इसका उपयोग कैसे नहीं कर सकता हूं। ग्रहण में django के माध्यम से इसे चलाना काम नहीं करता है क्योंकि यह उम्मीद करता है कि डेटाबेस मेरे सी ड्राइव की जड़ पर होना चाहिए जो मूर्खतापूर्ण प्रतीत होता है। कमांड लाइन के माध्यम से इसे चलाना काम नहीं करता है क्योंकि यह मेरी डेटाबेस फ़ाइल नहीं ढूंढ सकता है (जब तक कि मैं कुछ गलत नहीं कर रहा)

कोई सुझाव?

धन्यवाद!

+0

आप क्या करने की कोशिश कर रहे हैं? Sqlite3 डेटाबेस पर हजारों सम्मिलित कथन निष्पादित करें? – kefeizhou

उत्तर

11

के लिए SQLite FAQ पढ़ सकते हैं क्या आप लेनदेन का उपयोग कर रहे हैं? SQLite प्रत्येक insert statement individually by default के लिए एक लेनदेन तैयार करेगा, जो चीजों को धीमा कर देता है।

डिफ़ॉल्ट रूप से, sqlite3 मॉड्यूल एक डाटा संशोधन भाषा (DML) कथन (यानी सम्मिलित/अपडेट करें/हटाएं/REPLACE)

आप मैन्युअल रूप से बनाते हैं, तो एक ही लेन-देन से पहले परोक्ष लेनदेन को खोलता है शुरुआत में और अंत में इसे अंत में प्रतिबद्ध करें, यह चीजों को बहुत तेज करेगा।

+2

यही कारण है कि मैं इस साइट से प्यार करता हूँ। मेरे पास ओपी के समान सटीक समस्या थी, जो डीबी में 42000+ पंक्तियों को सम्मिलित करने का प्रयास कर रहा था। इसमें कुछ मिनट लग गए। यहां दिए गए उत्तरों के आधार पर, मैंने INSERT के आस-पास BEGIN..COMMIT स्टेटमेंट जोड़े और सभी पंक्तियों को सम्मिलित करने में 5 सेकंड से भी कम समय लगा। धन्यवाद! – sizzzzlerz

+0

क्या आप बस सभी प्रविष्टियों के चारों ओर लपेटने के लिए एक BEGIN और COMMIT कथन डालने के लिए कह रहे हैं? यदि sqlite3 स्वचालित रूप से लेन-देन करता है तो वह समस्या को और अधिक परेशान नहीं करेगा या यह sqlite3 के व्यवहार को रोक देगा – JPC

+1

@JPC हां, पहले डालने से पहले एक ही BEGIN डाल दें और अंतिम के बाद COMMIT। स्क्लाइट केवल तभी लेनदेन बनाएगा यदि यह पहले से नहीं है, इसलिए मैन्युअल रूप से निर्माण करने से समस्या होने से रोकती है। – mikel

3

क्या आपने एक ही लेनदेन के अंदर आवेषण चलाने का प्रयास किया था? यदि नहीं तो प्रत्येक डालने को लेनदेन के रूप में माना जाता है और .. अच्छी तरह से, आप इस here

1

एक पैरामिट्रीकृत क्वेरी

और

एक सौदे का प्रयोग करें का प्रयोग करें।

2

डेटाबेस फ़ाइल में VACUUM और ANALYZE भी कोशिश करें। इससे मेरी एक जैसी समस्या में मदद मिली।

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