2012-12-16 12 views
5

मेरे सेटअप पर, एक बड़ी सीएसवी फ़ाइल को तालिका में लोड करने का प्रयास करते समय PostgreSQL 9.2.2 त्रुटि में प्रतीत होता है।PostgreSQL के साथ समस्या एक बड़ी सीएसवी फ़ाइल को तालिका में लोड करना

csv फ़ाइल का आकार ~ 9GB

है यहाँ SQL विवरण मैं थोक लोड करने के लिए उपयोग कर रहा हूँ है:

copy chunksBase (chunkId, Id, chunk, chunkType) from path-to-csv.csv' delimiters ',' csv 

यहाँ त्रुटि मैं कुछ मिनट के बाद मिल रहा है:

pg.ProgrammingError: ERROR: out of memory 
DETAIL: Cannot enlarge string buffer containing 1073723635 bytes by 65536 more bytes. 
CONTEXT: COPY chunksbase, line 47680536 

मुझे लगता है कि बफर बिल्कुल 1 जीबी से अधिक आवंटित नहीं कर सकता है, जो मुझे लगता है कि यह postgresql.conf समस्या हो सकती है।

यहाँ postgresql.conf में uncommented लाइनों है:

bash-3.2# cat postgresql.conf | perl -pe 's/^[ \t]*//' | grep -v '^#' | sed '/^$/d' 
log_timezone = 'US/Central' 
datestyle = 'iso, mdy' 
timezone = 'US/Central' 
lc_messages = 'en_US.UTF-8'   # locale for system error message 
lc_monetary = 'en_US.UTF-8'   # locale for monetary formatting 
lc_numeric = 'en_US.UTF-8'   # locale for number formatting 
lc_time = 'en_US.UTF-8'    # locale for time formatting 
default_text_search_config = 'pg_catalog.english' 
default_statistics_target = 50 # pgtune wizard 2012-12-02 
maintenance_work_mem = 768MB # pgtune wizard 2012-12-02 
constraint_exclusion = on # pgtune wizard 2012-12-02 
checkpoint_completion_target = 0.9 # pgtune wizard 2012-12-02 
effective_cache_size = 9GB # pgtune wizard 2012-12-02 
work_mem = 72MB # pgtune wizard 2012-12-02 
wal_buffers = 8MB # pgtune wizard 2012-12-02 
checkpoint_segments = 16 # pgtune wizard 2012-12-02 
shared_buffers = 3GB # pgtune wizard 2012-12-02 
max_connections = 80 # pgtune wizard 2012-12-02 
bash-3.2# 

कुछ भी नहीं है कि स्पष्ट रूप से 1GB करने के लिए एक बफर सेट।

यहां क्या हो रहा है? यहां तक ​​कि यदि postgresql.conf में बफर को बढ़ाने का समाधान है, तो पोस्टग्रेस एक पूरी सीएसवी फ़ाइल को एकल कॉपी कॉल पर रैम में लोड करने और थोक लोड करने की प्रतीत क्यों कर रहा है? एक सोचता है कि बड़ी सीएसवी फाइल लोड करना एक आम काम है; मैं इस समस्या को पूरा करने वाला पहला व्यक्ति नहीं हो सकता; इसलिए मुझे लगता है कि पोस्टग्रेर्स ने थोक भार को तोड़ दिया होगा ताकि बफर सीमा पहले स्थान पर कभी न पहुंच सके।

एक कामकाज के रूप में, मैं सीएसवी को छोटी फाइलों में विभाजित कर रहा हूं, और फिर प्रत्येक फ़ाइल के लिए प्रतिलिपि बना रहा हूं। ऐसा लगता है कि ठीक काम कर रहा है। लेकिन यह एक विशेष रूप से संतोषजनक समाधान नहीं है, क्योंकि अब मुझे प्रत्येक बड़े सीएसवी के विभाजित संस्करणों को बनाए रखना है जिन्हें मैं पोस्टग्रेज़ में लोड करना चाहता हूं। पोस्टग्रेज़ में बड़ी सीएसवी फाइल को थोक लोड करने का एक और उचित तरीका होना चाहिए।

EDIT1: मैं यह सुनिश्चित करने की प्रक्रिया में हूं कि सीएसवी फ़ाइल किसी भी तरह से विकृत नहीं है। मैं पोस्टग्रेज़ में सभी विभाजित सीएसवी फाइलों को लोड करने की कोशिश करके ऐसा कर रहा हूं। अगर सभी को लोड किया जा सकता है, तो यह इंगित करता है कि सीएसवी फ़ाइल खराब होने के कारण यहां समस्या संभव नहीं है। मुझे पहले ही कुछ समस्याएं मिली हैं। अभी तक सुनिश्चित नहीं है कि बड़े सीएसवी लोड करने का प्रयास करते समय ये समस्याएं स्ट्रिंग बफर त्रुटि उत्पन्न कर रही हैं।

+1

मुझे लगता है कि अपनी CSV विकृत है - या अधिक विशेष, प्रारूप अपने 'COPY' आदेश में विनिर्दिष्ट के अनुरूप नहीं है। विवरण के लिए [सीएसवी हैंडलिंग पर प्रलेखन] देखें (http://www.postgresql.org/docs/current/static/sql-copy.html#AEN66692)। क्या आपके सीएसवी में बेजोड़ '' 'वर्ण है? – willglynn

+0

मुझे लगता है कि यह सिंगल या डबल कोट्स और स्ट्रिंग्स के साथ एक समस्या है। कुछ स्ट्रिंग मान ठीक तरह से समाप्त नहीं होते हैं या पाठ मानों के अंदर एकल वर्ण होते हैं (उदाहरण के लिए ... नहीं हैं ...), मैं दूसरे शर्त पर शर्त लगाता हूं। वैसे भी पोस्टग्रेस बड़ी स्ट्रिंग बफर करने की कोशिश कर रहा है, तो इसे मूल रूप से सीएसवी फ़ाइल में सहेजा जाता है। – Wojtas

+0

मैं पहले CSV फ़ाइल में (अधिकतम) लाइन लंबाई की जांच करता हूं। बीटीडब्लू: क्या यह आनुवांशिक/डीएनए डेटा है? – wildplasser

उत्तर

5

यह एक विकृत सीएसवी फ़ाइल साबित हुआ।

मैंने बड़े सीएसवी को छोटे हिस्सों में विभाजित किया (प्रत्येक में 1 मिलियन पंक्तियों के साथ) और प्रत्येक को पोस्टग्रेज़ में लोड करना शुरू कर दिया।

मैं अधिक सूचनात्मक त्रुटियों मिलने लगे:

pg.ProgrammingError: ERROR: invalid byte sequence for encoding "UTF8": 0x00 
CONTEXT: COPY chunksbase, line 15320779 

pg.ProgrammingError: ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0xae 0x22 
CONTEXT: COPY chunksbase, line 369513 

pg.ProgrammingError: ERROR: invalid byte sequence for encoding "UTF8": 0xed 0xaf 0x80 
CONTEXT: COPY chunksbase, line 16602 

अमान्य UTF8 बाइट दृश्यों, कुछ सौ करोड़ से बाहर के साथ 5 पंक्तियों की कुल थे। उन पंक्तियों को हटाने के बाद, 9 जीबी सीएसवी सिर्फ ठीक है।

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

ध्यान दें कि प्रारंभ में बड़ी फ़ाइल लोड करते समय त्रुटि में उल्लिखित रेखा संख्या, छोटे सीएसवी सबसेट फ़ाइलों को लोड करते समय पाए गए एन्कोडिंग त्रुटियों से कोई संबंध नहीं था। प्रारंभिक पंक्ति संख्या उस फ़ाइल में बिंदु थी जहां वास्तव में 1 जीबी डेटा हुआ था, इसलिए यह 1 जीबी बफर आवंटन त्रुटि से संबंधित था। लेकिन, उस त्रुटि में असली समस्या से कोई लेना देना नहीं था ...

+0

आप गलत त्रुटि संदेश के लिए एक बग रिपोर्ट दर्ज करना चाहेंगे। –

+0

ओरेकल के पास बहुत अधिक धन आयात है एल एसक्यूएल * लोडर जिसमें त्रुटियों की अधिक मजबूत हैंडलिंग है। पोस्टग्रे के साथ मैं आमतौर पर अपने सभी डेटा को स्टेजिंग टेबल में लोड करता हूं जिसमें टेक्स्ट डेटा प्रकार के साथ बनाए गए सभी कॉलम होते हैं। इस तरह से मैं डेटाबेस में सभी डेटा लोड कर सकता हूं और फिर डेटा समस्याओं को खोजने के लिए इसके खिलाफ अलग-अलग प्रश्न चला सकता हूं। – Kuberchaun

+0

बीटीडब्लू, इतनी बड़ी फाइल से डेटा कॉपी करने में पोस्टग्रेस कितना समय लगता है? – DataGreed

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