2016-07-25 4 views
8

मैं जिसके साथ मैं के लिए~ 50GB सीएसवी के प्रकाश प्रसंस्करण फ़ाइल

  • सीएसवी
  • के स्तंभों में से कई सबसेट ले लो करने के लिए एक अलग प्रारूप स्ट्रिंग विनिर्देश लागू करें एक ~ 50GB csv फ़ाइल है बढ़ाता है सीएसवी के कॉलम के प्रत्येक सबसेट।
  • प्रत्येक उपसेट के लिए अपने स्वयं के प्रारूप विनिर्देश के साथ आउटपुट एक नया सीएसवी आउटपुट।

मैं पांडा उपयोग करने के लिए, और (सिर्फ पांच लाख से अधिक एक लाइनों की) एक आसान हिस्सा आकार का हिस्सा अधिक पुनरावृत्ति एक DataFrame निर्माण करने के लिए, और प्रत्येक उत्पादन CSV में हिस्सा जोड़कर की एक सामान्य दृष्टिकोण का विकल्प चुना। इस तरह तो कुछ:

_chunk_size = 630100 

column_mapping = { 
    'first_output_specification' : ['Scen', 'MS', 'Time', 'CCF2', 'ESW10'], 
    # ..... similar mappings for rest of output specifications 
} 
union_of_used_cols = ['Scen', 'MS', 'Time', 'CCF1', 'CCF2', 'VS', 'ESW 0.00397', 'ESW0.08', 
        'ESW0.25', 'ESW1', 'ESW 2', 'ESW3', 'ESW 5', 'ESW7', 'ESW 10', 'ESW12', 
        'ESW 15', 'ESW18', 'ESW 20', 'ESW22', 'ESW 25', 'ESW30', 'ESW 35', 
        'ESW40'] 

chnk_iter = pd.read_csv('my_big_csv.csv', header=0, index_col=False, 
         iterator=True, na_filter=False, usecols=union_of_used_cols) 

cnt = 0 
while cnt < 100: 
    chnk = chnk_iter.get_chunk(_chunk_size) 
    chnk.to_csv('first_output_specification', float_format='%.8f', 
       columns=column_mapping['first_output_specification'], 
       mode='a', 
       header=True, 
       index=False) 
    # ..... do the same thing for the rest of the output specifications 

    cnt += 1 

मेरे समस्या कि इस वास्तव में धीमी है। प्रत्येक खंड में सीएसवी फाइलों में संलग्न होने के लिए लगभग एक मिनट लगते हैं, और इस प्रकार मैं कार्य को पूरा करने के लिए लगभग 2 घंटे देख रहा हूं।

मैंने सीएसवी में पढ़ते समय कॉलम सबसेट के संघ का उपयोग करके कुछ अनुकूलन करने की कोशिश की है, साथ ही साथ na_filter=False सेटिंग भी की है, लेकिन यह अभी भी स्वीकार्य नहीं है।

मैं सोच रहा था कि पाइथन में एक सीएसवी फ़ाइल की इस प्रकाश प्रसंस्करण को करने का कोई तेज़ तरीका है या तो मेरे दृष्टिकोण में अनुकूलन या सुधार के माध्यम से या शायद इस तरह के काम के लिए उपयुक्त एक बेहतर टूल है तो पांडस ... मेरे लिए (एक अनुभवहीन पांडस उपयोगकर्ता) ऐसा लगता है कि यह पांडों के साथ जितना तेज़ हो सकता है, लेकिन मैं बहुत गलत हो सकता हूं।

+1

क्या डेटाबेस दृष्टिकोण पर स्विच करना संभव है? यह एक बड़ी सीएसवी फ़ाइल है! –

+1

@Jylo मैं वास्तव में चाहता हूं कि मामला था, लेकिन नहीं। –

+0

क्या 'chunksize' में पंक्तियों की संख्या शामिल है जो आप प्रत्येक खंड में रखना चाहते हैं? – albert

उत्तर

6

मुझे नहीं लगता कि आपको पांडा के डेटाफ्रेम से कोई फायदा हो रहा है, इसलिए यह केवल ओवरहेड जोड़ रहा है। इसके बजाए, आप पाइथन के CSV module का उपयोग कर सकते हैं जो कि उपयोग में आसान है और सी

मेमोरी (शायद एक समय में 10 एमबी) में बहुत बड़ा हिस्सा पढ़ने पर विचार करें, फिर आगे बढ़ने से पहले प्रत्येक सुधारित कॉलम सबसेट लिखना अगले खंड में। इस तरह, इनपुट फ़ाइल केवल एक बार पढ़ और पार्स हो जाती है।

एक अन्य दृष्टिकोण आप की कोशिश कर सकते यूनिक्स cut आदेश के साथ उपयोग केवल उचित कॉलम निकालने के लिए (ताकि अजगर वस्तुओं को बनाने की जरूरत नहीं है और अप्रयुक्त कॉलम में डेटा के लिए स्मृति को आबंटित) preprocess के लिए है: cut -d, -f1,3,5 somedata.csv

अंत में, PyPy के तहत कोड चलाने का प्रयास करें ताकि आपकी स्क्रिप्ट का सीपीयू बाउंड हिस्सा उनके ट्रेसिंग जेआईटी के माध्यम से अनुकूलित हो सके।

0

मैं अजगर सीएसवी मॉड्यूल और जेनरेटर का उपयोग करने का प्रयास करूंगा।

मुझे जनरेटर विशाल सर्वर लॉग और ऐसे पार्सिंग के लिए अन्य दृष्टिकोणों की तुलना में बहुत तेज पाया है।

import csv 

def reader(csv_filename): 
    with open(csv_filename, 'r') as f: 
     csvreader = csv.reader(f, delimiter=',', quotechar="'") 
     for line in csvreader: 
      yield line # line is a tuple 

def formatter(lines): 
    for line in lines: 
     # format line according to specs 
     yield formatted_line 

def write(lines, csv_filename): 
    with open(csv_filename, 'w') as f: 
     writer = csv.writer(f) 
     for line in lines: 
      writer.writerow(line) 

lines = reader('myfile.in.csv') 
formatted_lines = formatter(lines) 
write(formatted_lines, 'myfile.out.csv') 

इसमें केवल एक उत्पादन सीएसवी में एक भी इनपुट सीएसवी बदलने एक को पढ़ने के लिए है, लेकिन आप उत्पादन कई फ़ाइलों को फ़ॉर्मेटर और लेखक लिख सकते हैं।

(अब मैं देखता हूं कि यह प्रश्न एक महीने पुराना है - सुनिश्चित नहीं है कि आपने अपनी समस्या पहले ही हल कर ली है - यदि नहीं और यदि आप अधिक विस्तृत स्पष्टीकरण/उदाहरण चाहते हैं तो मुझे बताएं।)

0

सीपीयू डिस्क एक्सेस से तेज़ है। एक चाल है अपनी फाइल को gzip और उस से पढ़ना है।

import gzip 

with gzip.open('input.gz','r') as fin: 
    for line in fin: 
     print('got line', line) 
संबंधित मुद्दे