दिलचस्प पोस्ट
दृश्य सी ++ 2010 एक्सप्रेस का उपयोग करते हुए 64-बिट अनुप्रयोग को कैसे संकलित करें? एक अपरिवर्तनीय वस्तु के सभी गुणों को अंतिम होना चाहिए? मटैब में गति-कुशल वर्गीकरण PHP चर में एक जेएस चर पास करें आवरण वस्तुओं की तुलना करने के लिए जावा में == ऑपरेटर का उपयोग करना PHP में सरणी तत्वों की कुंजी रीसेट करें? एक जेएसओएन स्ट्रिंग लेते हुए, उसे एक नक्शा इंटरफ़ेस {}, संपादन, और इसे बाइट में मार्शल करने में असमर्थ बनाते हुए अधिक जटिल लगता है तो यह होना चाहिए मैं उपयोगकर्ता नियंत्रण में एक घटना कैसे बना सकता हूं और इसे मुख्य प्रपत्र में हैंडल किया है? mysqli_fetch_array () पैरामीटर 1 mysqli_result, बूलीयन में होने की उम्मीद है जावा में वेबकैम से छवि कैप्चर करना? लोकल जेएसओएन डेटा के साथ जेपीसी मोबाइल सूची दृश्य जनसंख्या एसडीके में एंड्रॉइड बैटरी DOMSubtreemodified घटना DOM स्तर 3 में पदावनत क्यों है? SQL सर्वर: क्वेरी तीव्र है, लेकिन प्रक्रिया से धीमी है सी # में डुबकी प्रकार की कमी

Sqlite3 में तेज थोक आवेषण?

मेरे पास लगभग 30000 लाइनों की एक फ़ाइल है जो मैं एक sqlite3 डेटाबेस में लोड करना चाहता हूँ क्या प्रत्येक पंक्ति के डेटा के लिए सम्मिलित बयान बनाने से एक तेज़ तरीका है?

डेटा अंतरिक्ष-सीमांकित है और सीधे एक sqlite3 तालिका में नक्शे है। क्या डेटाबेस के लिए वॉल्यूम डेटा जोड़ने के लिए कोई भी प्रकार की बल्क डालने विधि है?

क्या किसी ने यह करने के कुछ विचलित तरीके से तैयार किया है, अगर यह नहीं बनाया गया है?

मुझे यह पूछ कर प्रस्तुत करना चाहिए, क्या एपीआई से ऐसा करने के लिए कोई सी ++ तरीका है?

वेब के समाधान से एकत्रित समाधान "Sqlite3 में तेज थोक आवेषण?"

इसके अतिरिक्त गति प्राप्त करने के लिए आप कुछ मापदंडों को भी स्पर्श करने की कोशिश कर सकते हैं। विशेष रूप से आप संभवतः PRAGMA synchronous = OFF; करना चाहते हैं PRAGMA synchronous = OFF;

  • एक लेनदेन में सभी INSERTs लपेटें, भले ही एक एकल उपयोगकर्ता है, यह अभी तक तेज़ है
  • तैयार बयान का उपयोग करें

आप .import आदेश का उपयोग करना चाहते हैं। उदाहरण के लिए:

 $ cat demotab.txt 44 92 35 94 43 94 195 49 66 28 135 93 135 91 67 84 135 94 $ echo "create table mytable (col1 int, col2 int);" | sqlite3 foo.sqlite $ echo ".import demotab.txt mytable" | sqlite3 foo.sqlite $ sqlite3 foo.sqlite -- Loading resources from /Users/ramanujan/.sqliterc SQLite version 3.6.6.2 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from mytable; col1 col2 44 92 35 94 43 94 195 49 66 28 135 93 135 91 67 84 135 94 

नोट करें कि यह बल्क लोडिंग कमान एसक्यूएल नहीं है, बल्कि एसक्यूएलआईटी की कस्टम फीचर है। जैसे कि इसमें एक अजीब वाक्यविन्यास है क्योंकि हम इसे इंटरैक्टिव कमांड लाइन इंटरप्रेटर, sqlite3 को echo माध्यम से पास कर रहे हैं।

PostgreSQL में समकक्ष COPY FROM : http://www.postgresql.org/docs/8.1/static/sql-copy.html

MySQL में यह LOAD DATA LOCAL INFILE : http://dev.mysql.com/doc/refman/5.1/en/load-data.html

एक आखिरी चीज:। .separator के मूल्य से सावधान रहना याद रखें। थोक आवेषण करते समय यह एक बहुत ही सामान्य पकड़ है

 sqlite> .show .separator echo: off explain: off headers: on mode: list nullvalue: "" output: stdout separator: "\t" width: 

करने से पहले आपको एक स्पेस, टैब, या अल्पविराम होने के लिए अलग से विभाजक सेट करना चाहिए।

  • PRAGMA default_cache_size को बहुत अधिक संख्या में बढ़ाएं इससे मेमोरी में कैश्ड पृष्ठों की संख्या में वृद्धि होगी।

  • प्रति पंक्ति एक लेनदेन के बजाय एक लेनदेन में सभी प्रविष्टियां लपेटें

  • सम्मिलित करने के लिए संकलित SQL कथन का उपयोग करें
  • अंत में, जैसा कि पहले ही उल्लेख किया गया है, यदि आप पूरी एसीआईडी ​​अनुपालन छोड़ने के लिए तैयार हैं, तो PRAGMA synchronous = OFF; सेट करें PRAGMA synchronous = OFF;

रे: "क्या एक तेज़ तरीका है जो डेटा के प्रत्येक पंक्ति के लिए सम्मिलित करें प्रविष्टियां उत्पन्न करता है?"

सबसे पहले: Sqlite3 के वर्चुअल तालिका एपीआई जैसे उपयोग के द्वारा 2 एसक्यूएल स्टेटमेंट्स को नीचे कट करें

 create virtual table vtYourDataset using yourModule; -- Bulk insert insert into yourTargetTable (x, y, z) select x, y, z from vtYourDataset; 

यह विचार यहाँ है कि आप एक सी इंटरफ़ेस को लागू करते हैं जो कि आपके स्रोत डेटा सेट को पढ़ता है और उसे एक आभासी तालिका के रूप में एसक्यूलाइट पर प्रस्तुत करता है और फिर आप स्रोत तालिका से एक ही प्रतिलिपि में लक्ष्य तालिका तक करते हैं। यह वाकई से वास्तव में कठिन लगता है और मैंने इस तरह से बड़ी गति में सुधार किया है।

दूसरा: यहां दी गई अन्य सलाह का प्रयोग करें, जो कि प्राग सेटिंग्स और लेनदेन का उपयोग करना है।

तीसरा: शायद देखें कि क्या आप लक्ष्य तालिका में कुछ अनुक्रमितियों से दूर कर सकते हैं। इस तरह से SQLite में प्रत्येक पंक्ति के लिए अद्यतन करने के लिए कम इंडेक्स होंगे

बल्क डालने का कोई तरीका नहीं है, लेकिन मेमोरी के लिए बड़ी मात्रा में लिखने का एक तरीका है, फिर उन्हें डेटाबेस में भेज दें। सी / सी + + एपीआई के लिए, बस करो:

sqlite3_exec (db, "BEGIN हस्तांतरण", शून्य, शून्य, शून्य);

… (INSERT स्टेटमेंट्स)

sqlite3_exec (डीबी, "कमिट व्यवहार", शून्य, शून्य, शून्य);

मान लें डीबी आपके डेटाबेस सूचक है

आपके INSERTS को BEGIN के बीच लपेट करना एक अच्छा समझौता है; और अंत; कीवर्ड अर्थात्:

 BEGIN; INSERT INTO table VALUES (); INSERT INTO table VALUES (); ... END; 

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

इन-मेमरी डेटाबेस के लिए, नल को फ़ाइल नाम के तर्क के रूप में sqlite3_open और सुनिश्चित करें कि TEMP_STORE को उचित रूप से परिभाषित किया गया है

(उपरोक्त सभी पाठ मेरे खुद के उत्तर से अलग स्क्लिट से संबंधित प्रश्न के लिए अंश हैं)

यदि आप बस एक बार डालने जा रहे हैं, तो आपके लिए गंदी चाल हो सकती है I

यह विचार सरल है, पहले स्मृति डेटाबेस में डालने, फिर बैकअप और अंत में अपने मूल डेटाबेस फ़ाइल में बहाल।

मैंने अपने ब्लॉग पर विस्तृत कदम लिखे हैं 🙂

मैंने इसे एक शॉट के लंबे आयात के लिए एक अच्छा मिश्रण मिला

 .echo ON .read create_table_without_pk.sql PRAGMA cache_size = 400000; PRAGMA synchronous = OFF; PRAGMA journal_mode = OFF; PRAGMA locking_mode = EXCLUSIVE; PRAGMA count_changes = OFF; PRAGMA temp_store = MEMORY; PRAGMA auto_vacuum = NONE; .separator "\t" .import a_tab_seprated_table.txt mytable BEGIN; .read add_indexes.sql COMMIT; .exit 

स्रोत: http://erictheturtle.blogspot.be/2009/05/fastest-bulk-import-into-sqlite.html

कुछ अतिरिक्त जानकारी: http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/