2011-10-15 5 views
16

में बहु-थ्रेडेड के साथ txt फ़ाइल पढ़ें, मैं अजगर में एक फ़ाइल को पढ़ने की कोशिश कर रहा हूं (इसे लाइन स्कैन करें और शर्तों की तलाश करें) और परिणाम लिखें- प्रत्येक शब्द के लिए काउंटर कहें। मुझे बड़ी मात्रा में फाइलों (3000 से अधिक) के लिए ऐसा करने की ज़रूरत है। क्या यह बहु थ्रेड किया जा सकता है? यदि हां, तो कैसे?पाइथन

तो, परिदृश्य इस तरह है:

  • सभी फाइलों को मैं पढ़ा है के लिए प्रत्येक फ़ाइल पढ़ें और स्कैन अपने लाइनों एक ही आउटपुट फाइल करने के लिए
  • काउंटरों लिखें।

दूसरा सवाल यह है कि, क्या यह पढ़ने/लिखने की गति में सुधार करता है।

आशा है कि यह पर्याप्त स्पष्ट है। धन्यवाद,

रॉन।

उत्तर

14

मैं @aix, multiprocessing से सहमत हूं निश्चित रूप से जाने का तरीका है। भले ही आप बाध्य होंगे I - o केवल इतना तेज़ पढ़ सकते हैं, भले ही आप कितनी समानांतर प्रक्रियाएं चल रहे हों। लेकिन आसानी से कुछ गतिशील हो सकते हैं।

निम्नलिखित पर विचार करें (इनपुट/एक निर्देशिका है जिसमें प्रोजेक्ट गुटेनबर्ग से कई .txt फ़ाइलें शामिल हैं)।

import os.path 
from multiprocessing import Pool 
import sys 
import time 

def process_file(name): 
    ''' Process one file: count number of lines and words ''' 
    linecount=0 
    wordcount=0 
    with open(name, 'r') as inp: 
     for line in inp: 
      linecount+=1 
      wordcount+=len(line.split(' ')) 

    return name, linecount, wordcount 

def process_files_parallel(arg, dirname, names): 
    ''' Process each file in parallel via Poll.map() ''' 
    pool=Pool() 
    results=pool.map(process_file, [os.path.join(dirname, name) for name in names]) 

def process_files(arg, dirname, names): 
    ''' Process each file in via map() ''' 
    results=map(process_file, [os.path.join(dirname, name) for name in names]) 

if __name__ == '__main__': 
    start=time.time() 
    os.path.walk('input/', process_files, None) 
    print "process_files()", time.time()-start 

    start=time.time() 
    os.path.walk('input/', process_files_parallel, None) 
    print "process_files_parallel()", time.time()-start 

जब मैं अपने डुअल कोर मशीन पर इस चलाने वहाँ एक ध्यान देने योग्य (लेकिन 2x) speedup है:

$ python process_files.py 
process_files() 1.71218085289 
process_files_parallel() 1.28905105591 

फ़ाइलों काफी छोटा स्मृति में फिट करने के लिए हैं, और आप के बहुत सारे है, तो ऐसा करने के लिए प्रसंस्करण जो I/o बाध्य नहीं है, तो आपको बेहतर सुधार भी देखना चाहिए।

+0

यदि आपके पास कई फ़ाइलें हैं तो मुझे लगता है कि यह बहुत सी प्रक्रियाएं बनाएगा। मुझे यह प्रक्रिया मिली .process_files() 16.5930001736 process_files_parallel() 100.887000084 – yossi

2

हां, इसे समानांतर तरीके से करना संभव होना चाहिए।

हालांकि, पायथन में एकाधिक धागे के साथ समांतरता हासिल करना मुश्किल है। इस कारण से multiprocessing समानांतर में चीजों को करने के लिए बेहतर डिफ़ॉल्ट विकल्प है।

यह कहना मुश्किल है कि आप किस तरह की गति प्राप्त करने की उम्मीद कर सकते हैं। यह इस बात पर निर्भर करता है कि वर्कलोड का कौन सा अंश समांतर (अधिक बेहतर) में करना संभव होगा, और कौन सा अंश क्रमशः किया जाना चाहिए (कम बेहतर)।

+0

"हालांकि, पाइथन में एकाधिक धागे के साथ समांतरता हासिल करना मुश्किल है" क्या आप इसके लिए कारण बता सकते हैं? महान उत्तर +1 – Tagar