2012-09-28 11 views
7

में बहुत सी सीएसवी फाइलों को आयात करने का कुशल तरीका मैं एक पोस्टग्रेएसक्यूएल डीबी में एक सीएसवी आयात करने के कई उदाहरण देखता हूं, लेकिन मुझे जो चाहिए वह 500,000 सीएसवी को एक पोस्टग्रेएसक्यूएल डीबी में आयात करने का एक प्रभावी तरीका है। प्रत्येक सीएसवी 500KB से थोड़ा अधिक है (इसलिए लगभग 272 जीबी डेटा का भव्य कुल)।PostgreSQL डीबी

सीएसवी समान रूप से स्वरूपित हैं और कोई डुप्लिकेट रिकॉर्ड नहीं हैं (डेटा कच्चे डेटा स्रोत से प्रोग्रामेटिक रूप से जेनरेट किया गया था)। मैं खोज रहा हूं और विकल्पों के लिए ऑनलाइन खोजना जारी रखूंगा, लेकिन यह संभवतः सबसे कुशल तरीके से किए जाने पर किसी भी दिशा की सराहना करता हूं। मेरे पास पाइथन के साथ कुछ अनुभव है, लेकिन उचित लगता है कि किसी अन्य समाधान में खोद जाएगा।

धन्यवाद!

+1

PostgreSQL में डेटा आयात करने का सबसे तेज़ तरीका 'COPY' आदेश का उपयोग करने के लिए है। –

उत्तर

0

आपके पास मौजूद डेटा का अच्छा हिस्सा है। मैं Postgre के बारे में 100% निश्चित नहीं हूं, लेकिन कम से कम MySQL कुछ SQL आदेश प्रदान करता है, सीधे एक तालिका में एक सीएसवी फ़ीड करने के लिए। यह किसी भी सम्मिलित चेक को छोड़ देता है और इसी तरह से और किसी भी सामान्य सम्मिलन संचालन की तुलना में तीव्रता के क्रम से अधिक है।

तो जाने का शायद सबसे तेज़ तरीका कुछ सरल पायथन स्क्रिप्ट तैयार करता है, जो आपके पोस्टग्रे सर्वर को बताता है, जो सीएसवी फाइलें जिसमें भूख से अंतहीन तालिकाओं में भस्म हो जाती है।

7

आप पढ़ PostgreSQL guide "Populating a Database" आप सलाह के कई टुकड़े देखेंगे द्वारा शुरू करते हैं: एक एकल लेनदेन में

  1. डाटा लोड करें।
  2. यदि संभव हो तो COPY का उपयोग करें।
  3. डेटा लोड करने से पहले इंडेक्स, विदेशी कुंजी बाधाएं आदि हटाएं और बाद में उन्हें पुनर्स्थापित करें।

PostgreSQL के COPY statement पहले से ही सीएसवी प्रारूप का समर्थन करता है:

COPY table (column1, column2, ...) FROM '/path/to/data.csv' WITH (FORMAT CSV) 

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

+0

गैरेथ - मुझे आपकी प्रतिक्रिया से लगता है कि आप प्रतिलिपि कथन में वाइल्डकार्ड का उपयोग नहीं कर सकते हैं? मैं जो कह सकता हूं, उससे फ़ाइलों की सूची बनाने के लिए मुझे कुछ प्रकार की प्रोग्रामिंग विधि चाहिए और फिर व्यक्तिगत कॉपी कमांड जारी करें। अगर मैं गलत हूं कृपया मुझे सही। मुझे उम्मीद है कि मैं हूं :)। अगर मैं सिर्फ वाइल्डकार्ड * .csv – FredG

+0

के साथ प्रतिलिपि कथन जारी कर सकता हूं तो यह बहुत आसान होगा। निश्चित रूप से 'COPY' आदेशों का अनुक्रम उत्पन्न करना आसान है? आप इसे खोल सकते हैं, उदाहरण के लिए: '(फ़ाइल के लिए /path/to/*.csv में; echo करें" कॉपी करें (कॉलम 1, कॉलम 2, ...) '$ FILE' से (FORMAT CSV); "; किया गया)> import-command.sql' –

+0

क्या यह थोड़ा अक्षम नहीं है?500,000 कॉपी कमांड के साथ एक फाइल जेनरेट करना? – FredG

0

मैं php और postgres का उपयोग करें, और php के साथ csv फ़ाइल पढ़ सकते हैं और निम्न स्वरूप में एक स्ट्रिंग की सवारी: PostgreSQL कार्य करने के लिए स्ट्रिंग पैरामीटर पारित करके एक एकल लेनदेन में

{ {line1 column1, line1 column2, line1 column3} , { line2 column1,line2 column2,line2 column3} } 

देखभाल।

मैं सभी रिकॉर्ड, स्वरूपण, डेटा की मात्रा आदि की जांच कर सकता हूं, और लगभग 3 मिनट में 500,000 रिकॉर्ड आयात करने का परिणाम प्राप्त कर सकता हूं।

PostgreSQL समारोह में डेटा को पढ़ने के लिए:

DECLARE 
    d varchar[]; 
BEGIN 

    FOREACH d SLICE 1 IN ARRAY p_dados 
    LOOP 


    INSERT INTO schema.table (
     column1, 
     column2, 
     column3, 
    ) 
    VALUES ( 
     d[1], 
     d[2]::INTEGER, -- explicit conversion to INTEGER 
     d[3]::BIGINT, -- explicit conversion to BIGINT 
    );   
    END LOOP; 

    END;