2013-06-06 6 views
5

मैं अनुक्रम बनाम अनुक्रम में फ़ाइलों को पढ़ने के बीच व्यापार-बंद के बारे में सोच रहा हूं।अनुक्रमिक या समांतर: पायथन में एकाधिक फ़ाइलों को पढ़ने का उचित तरीका क्या है?

मान लें कि मेरे पास एक लाख मेगाबाइट आकार की फाइलें हैं जिन्हें मैं संसाधित करना चाहता हूं, लेकिन उनमें से सभी को एक साथ रखने के लिए पर्याप्त स्मृति नहीं है। इन क्रमिक रूप से संसाधन के लिए, मैं कर सकते हैं:

results = [do_something(os.path.join(files, f)) for f in os.listdir(files)] 

या मैं समानांतर में यह कर सकते हैं:

paths = [os.path.join(files, f) for f in os.listdir(files)] 
p = multiprocessing.Pool() 
try: 
    results = p.map(do_something, paths) 
    p.close() 
    p.join() 
except KeyboardInterrupt: 
    p.terminate() 

सामान्य तौर पर मैं गया है समानांतर प्रदर्शन मैं/हे क्योंकि यादृच्छिक डिस्क पढ़ने काफी है के खिलाफ चेतावनी दी धीमी गति से। लेकिन इस मामले में जाने के रास्ते समानांतर है? या शायद कुछ मिश्रित रणनीति?

इसके अलावा, मुझे लगता है कि समांतर संस्करण निर्देशिका की संरचना को संरक्षित करता है; यह कहना है, आउटपुट सही क्रम में है। क्या इसका मतलब यह है कि यह वास्तव में अनुक्रमिक रूप से कर रहा है, या पाइथन सिर्फ दयालु है? संपादित करें: ब्लेंडर ने इस दूसरे प्रश्न को मंजूरी दे दी। धन्यवाद, ब्लेंडर!

सहायता के लिए धन्यवाद।

+4

'p.map' क्रम में चीजें देता है। आप 'p.map_async' या' p.imap_unordered' – Blender

+0

पर विचार करना चाहेंगे, – yaccz

+0

क्या करता है इस पर निर्भर करता है कि आप यह मान सकते हैं कि कुछ ऐसा महंगा महंगा कार्य है जो फ़ाइल की सामग्री का विश्लेषण करता है। – rhombidodecahedron

उत्तर

2

यह आंशिक रूप से उस स्टोरेज माध्यम के प्रकार पर निर्भर करता है जिस पर वे हैं। एक पारंपरिक हार्ड ड्राइव गतिविधि की तलाश के कारण लगभग रुकावट में क्रॉल करेगा। एक एसएसडी, ओटीओएच, यादृच्छिक पढ़ने के लिए बहुत कम संवेदनशील है (हालांकि यह पूरी तरह से अप्रभावित नहीं है)।

यहां तक ​​कि यदि आपके पास एसएसडी है, तो आप पाएंगे कि रिटर्न कम करने का एक बिंदु है, हालांकि डिफ़ॉल्ट पूल आकार शायद ठीक है, और आप यह भी पा सकते हैं कि मीठा स्थान cpu_count() से अधिक है। कोई भविष्यवाणियां करने के लिए बहुत सारे कारक हैं, इसलिए आपको विभिन्न पूल आकारों का प्रयास करना चाहिए।

2

डिस्क आईओ द्वारा समांतर प्रसंस्करण को नुकसान पहुंचाया जाएगा यदि आपके पास प्रति फ़ाइल एकाधिक डिस्क एक्सेस हैं। हालांकि, अगर आप do_something में बहुत कम प्रोसेसिंग कर रहे हैं तो यह थ्रेड पूल में होने वाले संदर्भ स्विचिंग के लिए आवश्यक प्रसंस्करण के लायक नहीं हो सकता है। चूंकि आप कहते हैं कि do_something काफी महंगा है, यह शायद समानांतर में प्रसंस्करण के लायक है।

इसके अलावा, आप डिस्क IO को कम कर सकते हैं यदि आप फ़ाइलों को लाइन लाइन को पढ़ने के बाद फ़ाइलों को पूरी तरह से स्मृति में पढ़ते हैं। बेशक इसके लिए अधिक मेमोरी की आवश्यकता होगी, लेकिन यह शायद प्रसंस्करण समय को काफी कम कर देगा।

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

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