मेरे सेटअप पर, एक बड़ी सीएसवी फ़ाइल को तालिका में लोड करने का प्रयास करते समय 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: मैं यह सुनिश्चित करने की प्रक्रिया में हूं कि सीएसवी फ़ाइल किसी भी तरह से विकृत नहीं है। मैं पोस्टग्रेज़ में सभी विभाजित सीएसवी फाइलों को लोड करने की कोशिश करके ऐसा कर रहा हूं। अगर सभी को लोड किया जा सकता है, तो यह इंगित करता है कि सीएसवी फ़ाइल खराब होने के कारण यहां समस्या संभव नहीं है। मुझे पहले ही कुछ समस्याएं मिली हैं। अभी तक सुनिश्चित नहीं है कि बड़े सीएसवी लोड करने का प्रयास करते समय ये समस्याएं स्ट्रिंग बफर त्रुटि उत्पन्न कर रही हैं।
मुझे लगता है कि अपनी CSV विकृत है - या अधिक विशेष, प्रारूप अपने 'COPY' आदेश में विनिर्दिष्ट के अनुरूप नहीं है। विवरण के लिए [सीएसवी हैंडलिंग पर प्रलेखन] देखें (http://www.postgresql.org/docs/current/static/sql-copy.html#AEN66692)। क्या आपके सीएसवी में बेजोड़ '' 'वर्ण है? – willglynn
मुझे लगता है कि यह सिंगल या डबल कोट्स और स्ट्रिंग्स के साथ एक समस्या है। कुछ स्ट्रिंग मान ठीक तरह से समाप्त नहीं होते हैं या पाठ मानों के अंदर एकल वर्ण होते हैं (उदाहरण के लिए ... नहीं हैं ...), मैं दूसरे शर्त पर शर्त लगाता हूं। वैसे भी पोस्टग्रेस बड़ी स्ट्रिंग बफर करने की कोशिश कर रहा है, तो इसे मूल रूप से सीएसवी फ़ाइल में सहेजा जाता है। – Wojtas
मैं पहले CSV फ़ाइल में (अधिकतम) लाइन लंबाई की जांच करता हूं। बीटीडब्लू: क्या यह आनुवांशिक/डीएनए डेटा है? – wildplasser