2017-01-30 11 views
5

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो दो तर्क ले सकता है और फिर इसे multiprocessing.Pool पर जोड़ सकता है और इसे समानांतर करता है। जब मैंने इस सरल कार्य को लिखने की कोशिश की तो मुझे कुछ जटिलताएं थीं।पायथन: मानचित्र और मल्टीप्रोसेसिंग का उपयोग

df = pd.DataFrame() 
df['ind'] = [111, 222, 333, 444, 555, 666, 777, 888] 
df['ind1'] = [111, 444, 222, 555, 777, 333, 666, 777] 

def mult(elem1, elem2): 
    return elem1 * elem2 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    print(pool.map(mult, df.ind.astype(int).values.tolist(), df.ind1.astype(int).values.tolist())) 
    pool.terminate() 

यह एक त्रुटि लौटा रहा है:

TypeError: unsupported operand type(s) for //: 'int' and 'list' 

मैं नहीं समझ सकता कि क्या गलत है। क्या कोई यह समझा सकता है कि इस त्रुटि का अर्थ क्या है और मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

6

बहु-प्रक्रिया पूल मॉड्यूल उन तर्कों की एक सूची में लेता है जिन्हें आप बहु-प्रक्रिया करना चाहते हैं, और केवल एक तर्क लेने में सहायता करता है। आप निम्न कार्य करके इसे ठीक कर सकते हैं:

from multiprocessing import Pool 
import pandas as pd 

df = pd.DataFrame() 
df['ind'] = [111, 222, 333, 444, 555, 666, 777, 888] 
df['ind1'] = [111, 444, 222, 555, 777, 333, 666, 777] 

def mult(elements): 
    elem1,elem2 = elements 
    return elem1 * elem2 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = zip(df.ind.astype(int).values.tolist(), df.ind1.astype(int).values.tolist()) 
    print(pool.map(mult, inputs)) 
    pool.terminate() 

मैं यहाँ क्या किया है प्रत्येक तत्व दो तर्क है कि आप इनपुट करना चाहता था होने के साथ एक सूची में अपने दो iterables ज़िप है। अब, मैं उन तर्कों को अनपैक करने के लिए आपके फ़ंक्शन का इनपुट बदलता हूं ताकि उन्हें संसाधित किया जा सके।

+0

एक परीक्षण केस स्थापित करने के लिए टेम्पलेट। जीआईएल से बचने और सी में चलाने के लिए इसे आंतरिक रूप से 'पांडा' द्वारा नियंत्रित नहीं किया जा सकता है? पूल बनाने और इसका समन्वय करने के ऊपरी हिस्से का मतलब यह है कि यह एक मूर्ख दृष्टिकोण है (ओपीएस कठिनाई को ठीक करने के बावजूद)? – roganjosh

+0

मुझे यकीन है कि पांडों में उचित रूप से इनपुट बनाने का एक तरीका है ताकि यह बेहतर हो सके। जहां तक ​​ओवरहेड जाता है, वह शायद एप्लिकेशन विशिष्ट होगा, इसलिए मेरे लिए जवाब देना मुश्किल होगा। ईमानदार होने के लिए, मैं मल्टीप्रोसेसिंग का उपयोग करने के लिए थोड़ा नया हूं इसलिए मुझे नहीं लगता कि मैं आपके प्रश्नों का सबसे अच्छा जवाब जानूंगा। हालांकि, मैंने ओपी के विशिष्ट मुद्दे में भाग लिया है। – tmwilson26

+0

मैं जांच करूंगा हालांकि मैं आज रात अपना खुद का टेस्ट केस नहीं प्राप्त कर सकता हूं। निश्चित रूप से मल्टीप्रोसेसिंग में स्पॉन्गिंग प्रक्रियाओं में एक बड़ा ओवरहेड होता है और यह मेरी समझ है कि इसे केवल वेक्टरिज्ड किया जा सकता है ... इस बिंदु पर कि यह इस दृष्टिकोण को अमान्य करता है। हालांकि मैं ऊपर से सवाल का जवाब देता हूं, मुझे लगता है कि दृष्टिकोण का आधार त्रुटिपूर्ण है, लेकिन खुद को सीख रहा है :) – roganjosh

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