2015-12-25 3 views
6

में पोस्टग्रेस्क्ल प्रदर्शन और मेमोरी उपयोग ट्यूनिंग मैं मॉडल डेटाबेस के लिए पोस्टग्रेस्क्ल 9.4 का उपयोग करता हूं। मेरे तालिका इस तरह कुछ हद तक दिखता है:एक पायथन वर्कफ़्लो

CREATE TABLE table1 (
sid INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('table1_sid_seq'::regclass), 
col1 INT, 
col2 INT, 
col3 JSONB); 

मेरे अजगर 2.7 कार्यप्रवाह अक्सर इस तरह दिखता है:

curs.execute("SELECT sid, col1, col2 FROM table1") 
data = curs.fetchall() 
putback = [] 
for i in data: 
    result = do_something(i[1], i[2]) 
    putback.append((sid, result)) 
del data 
curs.execute("UPDATE table1 
       SET col3 = p.result 
       FROM unnest(%s) p(sid INT, result JSONB) 
       WHERE sid = p.sid", (putback,)) 

यह आमतौर पर बहुत अच्छी तरह से और कुशलता से काम करता है। हालांकि, बड़े प्रश्नों के लिए पोस्टग्रेस्क्ल मेमोरी उपयोग कभी-कभी UPDATE कमांड के दौरान छत (> 50 जीबी) के माध्यम से जाएगा और मुझे विश्वास है कि यह ओएस एक्स द्वारा मारा जा रहा है, क्योंकि मुझे WARNING: terminating connection because of crash of another server process मिलता है। मेरे मैकबुक प्रो में 16 जीबी रैम है और प्रश्न में पूछताछ में 11 एम लाइनें हैं जिनमें से प्रत्येक को लिखने के लिए डेटा के लगभग 100 गुण हैं।

मेरे postgresql.conf:

default_statistics_target = 50 
maintenance_work_mem = 512MB 
constraint_exclusion = on 
checkpoint_completion_target = 0.9 
effective_cache_size = 4GB 
work_mem = 256MB 
wal_buffers = 16MB 
checkpoint_segments = 128 
shared_buffers = 1024MB 
max_connections = 80 

तो मुझे आश्चर्य है कि

  1. क्यों मेरी क्वेरी रैम कभी कभी अत्यधिक मात्रा में लेने वाली है?
  2. मैं मेमोरी उपयोग को कैसे नियंत्रित कर सकता हूं और अभी भी अच्छे प्रदर्शन की गारंटी दे सकता हूं?
  3. क्या पोस्टग्रेस्क्ल ट्यूनिंग के लिए कोई अच्छा दिशानिर्देश या उपकरण है?

अद्यतन:
मैं बहुत यकीन है कि @wildplasser मेरी समस्या इंगित कर रहा हूँ। टिप्पणियों में वह डेटा को डेटाबेस में पहले डंप करने का सुझाव देता है, और इसे वहां से अनपैक करता है। दुर्भाग्य से मैं यह नहीं समझ पाया कि उसके प्रस्ताव को कैसे कार्यान्वित किया जाए। अगर किसी को यह पता है कि ऐसा कैसे करना है, तो उनका जवाब खुशी से स्वीकार किया जाएगा।

+0

1) आपका work_mem (बल्कि) उच्च है, और आप (शायद) में कोई टेबल संरचना नहीं है। 2) अपने डेटाबेस को डिज़ाइन करें 3) 2 बीटीडब्लू देखें: आपकी चयन क्वेरी * सभी * पंक्तियां लाती है (और मुझे आपकी अपडेट क्वेरी नहीं आती है।) – wildplasser

+0

हां। आपकी तालिका एक स्प्रेडशीट की तरह लग सकती है, मुझे नहीं पता। हाँ। – wildplasser

+0

बीटीडब्ल्यू: मैं आपके बारे में पाइथन सामान के बारे में एक शब्द नहीं समझता, लेकिन यह * लगता है * जैसे आप पूरे डीबी-टेबल को एक अजगर सेट या सरणी में चूस रहे हैं, और उसी तालिका को अपडेट करने के लिए उस (विस्फोटित रूप में) का उपयोग करें। – wildplasser

उत्तर

1

मेरे वैकल्पिक हल के रूप में प्रस्तावित here एक साधारण समारोह के साथ putback काट के लिए है:

def chunk(l, n): 
    n = max(1, n) 
    return [l[i:i + n] for i in range(0, len(l), n)] 

और फिर

for chunk in chunk(putback, 250000): 
    curs.execute("UPDATE table1 
        SET col3 = p.result 
        FROM unnest(%s) p(sid INT, result JSONB) 
        WHERE sid = p.sid", (chunk,)) 

यह काम करता है, यानी की जांच में स्मृति पदचिह्न रखती है, बल्कि जैसा कि मैं आमतौर पर करता हूं, सभी डेटा को एक साथ डंप करने से बहुत ही सुरुचिपूर्ण और धीमा नहीं होता है।

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