2013-08-13 12 views
13

का उपयोग कर मैं इस पढ़ा SQLite में विशाल डेटा सम्मिलित करें: Importing a CSV file into a sqlite3 database table using Pythonथोक अजगर

और ऐसा लगता है कि हर कोई पंक्ति-दर-पंक्ति को पढ़ने के बजाय SQLite से थोक .import का उपयोग कर का उपयोग कर पता चलता है। हालांकि, यदि आपके पास डेटा की लाखों पंक्तियां हैं तो इससे सम्मिलन वास्तव में धीमा हो जाएगा। क्या इसे रोकने के लिए कोई और तरीका है?

अद्यतन: मैंने रेखा से लाइन डालने के लिए निम्न कोड का प्रयास किया लेकिन गति उतनी अच्छी नहीं है जितनी मुझे उम्मीद थी। सुधार करने के लिए यह

for logFileName in allLogFilesName: 
    logFile = codecs.open(logFileName, 'rb', encoding='utf-8') 
    for logLine in logFile: 
     logLineAsList = logLine.split('\t') 
     output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList) 
    logFile.close() 
connection.commit() 
connection.close() 

उत्तर

17

जनरेटर अभिव्यक्तियों का उपयोग करके फ्लाई पर अपने डेटा को विभाजित करें, लेनदेन के अंदर आवेषण करें। जब तक पहले से ही एक लेनदेन में, प्रत्येक SQL विवरण एक नया लेन-देन के लिए यह शुरू कर दिया है

: यहाँ sqlite optimization FAQ से एक उद्धरण है। यह बहुत महंगा है, क्योंकि इसे प्रत्येक कथन के लिए जर्नल फ़ाइल को फिर से खोलना, लिखना और बंद करना आवश्यक है। इसे BEGIN TRANSACTION के साथ SQL कथन के अनुक्रमों को लपेटकर बचाया जा सकता है; और अंत हस्तांतरण; बयान। यह स्पीडअप उन बयानों के लिए भी प्राप्त किया जाता है जो डेटाबेस को परिवर्तित नहीं करते हैं।

Here's आपका कोड कैसा दिख सकता है।

इसके अलावा, स्क्लाइट में import CSV files की क्षमता है।

+0

SQLite कई सीएसवी फ़ाइलों को एक साथ आयात कर सकता है। मुझे ऐसा करने का कोई रास्ता नहीं मिला? – Shar

+0

ऐसा नहीं लगता कि एक बार में कई सीएसवी फाइलों को आयात करना संभव है। डेटा में भाग विभाजित करना और उन्हें लेनदेन में डालने का तरीका होना चाहिए, मुझे लगता है। – alecxe

+0

धन्यवाद! मुझे लगता है कि मैं उसके साथ जाऊंगा। – Shar

14

SQLite tens of thousands of inserts per second कर सकते हैं, बस शुरू और COMMIT साथ आवेषण आसपास के द्वारा एक एकल लेनदेन में उन सभी को करना सुनिश्चित करें वहाँ वैसे भी है। (execemany() यह स्वचालित रूप से करता है।)

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

+0

धन्यवाद! मैं अभी कोशिश कर रहा हूं और गति पर रिपोर्ट करूंगा। – Shar

+0

मैंने लाइन से रेखा डालने के द्वारा सुझाए गए सुझावों की कोशिश की। गति बहुत खराब नहीं है, लेकिन यह अभी भी उतनी तेज़ नहीं है जितनी मुझे उम्मीद है। शायद मेरा कोड पर्याप्त रूप से पर्याप्त नहीं लिखा गया था। मैंने उपरोक्त प्रश्न में इसे अद्यतन किया। क्या तुम्हारे पास कोई सुझाव है? – Shar

23

चूंकि यह Google खोज पर शीर्ष परिणाम है, मैंने सोचा कि यह प्रश्न अपडेट करना अच्छा हो सकता है।

python sqlite docs से

आप

import sqlite3 

persons = [ 
    ("Hugo", "Boss"), 
    ("Calvin", "Klein") 
] 

con = sqlite3.connect(":memory:") 

# Create the table 
con.execute("create table person(firstname, lastname)") 

# Fill the table 
con.executemany("insert into person(firstname, lastname) values (?,?)", persons) 

उपयोग कर सकते हैं मैं इस विधि का इस्तेमाल किया है एक समय में 50 से अधिक पंक्ति आवेषण प्रतिबद्ध करने के लिए और यह बिजली की तेजी है।

+1

यह बिजली भी तेज है क्योंकि आप स्क्लाइट का उपयोग इन-मेमोरी डेटाबेस के रूप में कर रहे हैं ... – aramaki

+0

एक 2 मिनट से कम समय तक 2 मिनट का निर्माण कार्य कम कर दिया! और यह एक फ़ाइल डेटाबेस है, इसलिए यह बिजली है वैसे भी – Math

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