2015-04-28 8 views
11

कब उठाया जा सकता है मैं मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करके पाइथन में समांतर प्रसंस्करण की उचित मात्रा में कर रहा हूं। मुझे पता है कि कुछ वस्तुएं अचार हो सकती हैं (इस प्रकार बहु-पी में तर्क के रूप में पारित) और अन्य नहीं कर सकते हैं। जैसेपाइथन ऑब्जेक्ट को

class abc(): 
    pass 

a=abc() 
pickle.dumps(a) 
'ccopy_reg\n_reconstructor\np1\n(c__main__\nabc\np2\nc__builtin__\nobject\np3\nNtRp4\n.' 

लेकिन मैं अपने कोड (एक दर्जन तरीकों, या तो) में कुछ बड़े वर्गों है, और ऐसा होता है:

a=myBigClass() 
pickle.dumps(a) 
Traceback (innermost last): 
File "<stdin>", line 1, in <module> 
File "/usr/apps/Python279/python-2.7.9-rhel5-x86_64/lib/python2.7/copy_reg.py", line 70, in _reduce_ex 
raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle file objects 

यह नहीं एक फ़ाइल वस्तु है, लेकिन अन्य समय में, मैं हूँ मूल रूप से कहने वाले अन्य संदेश प्राप्त करें: "मैं इसे नहीं चुन सकता"।

तो नियम क्या है? बाइट्स की संख्या? पदानुक्रम की गहराई? चंद्रमा का चरण?

+1

क्या आपने डिल की कोशिश की है? https://pypi.python.org/pypi/dill यह 'अचार' संभावनाओं को बहुत बढ़ाता है। – geekazoid

+1

मैंने वास्तव में अभी डिल की कोशिश की और यह काम करता है, लेकिन यह हमारे निर्माण का हिस्सा नहीं है, इसलिए मुझे सिस्टम प्रशासक से अनुरोध करना होगा। फिर भी आश्चर्य है कि 'नियम' क्या है। –

+1

@PaulNelson यदि आप 'dill' का उपयोग करने जा रहे हैं, तो आप 'मल्टीप्रोसेसिंग' का उपयोग नहीं कर सकते हैं। 'डिल' लेखक के पास 'मल्टीप्रोसेसिंग' कांटा होता है जिसे 'पथ' कहा जाता है जिसे आप इसके बजाय उपयोग करना चाहते हैं। – dano

उत्तर

3

मैं dill लेखक। क्या अचार की एक विस्तृत व्यापक सूची है और dill के हिस्से के रूप में क्या नहीं है। इसे पाइथन 2.5-3.4 के प्रति संस्करण चलाया जा सकता है, और dill के साथ अचार के लिए समायोजित किया जा सकता है या एक ध्वज बदलकर pickle के साथ क्या अचार।

यहाँ देखें: https://github.com/uqfoundation/dill/blob/master/tests/test_objects.py और https://github.com/uqfoundation/dill/blob/master/dill/_objects.py

नियमों की जड़ क्या अचार (मेरे सिर के ऊपर से) है:

  1. आप (संदर्भ द्वारा वस्तु की स्थिति पर कब्जा कर सकते हैं यानी एक समारोह एक आयातित समारोह बनाम __main__ में परिभाषित किया गया)? [फिर, हाँ]
  2. क्या सामान्य __get_state____set_state__ नियम दिए गए ऑब्जेक्ट प्रकार के लिए मौजूद है? [फिर, हाँ]
  3. क्या यह Frame ऑब्जेक्ट पर निर्भर करता है (यानी जीआईएल और वैश्विक निष्पादन ढेर पर भरोसा करते हैं)? Iterators अब द्वारा unpickling पर iterator "replaying" द्वारा अपवाद हैं। [फिर, कोई]
  4. करता है (उदाहरण के लिए बंद करने में परिभाषित किया जा रहा की वजह से, सी-बाइंडिंग, या अन्य __init__ पथ जोड़तोड़ में) गलत वर्ग पथ के लिए वस्तु दृष्टान्त बिंदु? [फिर,]
  5. क्या इसे अनुमति देने के लिए पाइथन द्वारा खतरनाक माना जाता है? [फिर, कोई]

तो, (5) कम प्रचलित अब की तुलना में यह हुआ करता था, लेकिन अभी भी pickle के लिए भाषा का में कुछ समय तक चलने वाले असर पड़ता है। अधिकांश भाग के लिए dill, हटाता है (1), (2), और (5) - लेकिन अभी भी (3) और (4) द्वारा काफी प्रभावित है।

मैं कुछ और भूल रहा हूं, लेकिन मुझे लगता है कि आम तौर पर वे अंतर्निहित नियम हैं।

multiprocessing जैसे कुछ मॉड्यूल उनके ऑब्जेक्ट्स के लिए महत्वपूर्ण कुछ ऑब्जेक्ट्स पंजीकृत करते हैं। dill भाषा में अधिकांश वस्तुओं को पंजीकृत करता है।

multiprocessing की dill कांटा की आवश्यकता है क्योंकि multiprocessingcPickle का उपयोग करता है, और dill केवल शुद्ध अजगर अचार बनाने रजिस्ट्री संवर्धित कर सकते है। यदि आप धैर्य रखते हैं, तो आप dill में सभी प्रासंगिक copy_reg फ़ंक्शंस के माध्यम से जा सकते हैं, और उन्हें cPickle मॉड्यूल पर लागू कर सकते हैं और आपको एक और अधिक अचार सक्षम सक्षम multiprocessing मिल जाएगा। मुझे pickle के लिए ऐसा करने के लिए एक सरल (पढ़ें: एक लाइनर) तरीका मिला है, लेकिन cPickle नहीं है।

+0

यह वही है जो मैं खोज रहा था। धन्यवाद माइक –

7

docs से:

निम्नलिखित प्रकार मसालेदार जा सकता है:

  • कोई नहीं, यह सच है, और झूठी
  • पूर्णांकों, लंबे पूर्णांकों, चल बिन्दु संख्या, जटिल संख्याओं
  • सामान्य और यूनिकोड तार
  • टुपल्स, सूचियां, सेट, और शब्दकोश केवल पिकलेबल ऑब्जेक्ट्स युक्त
  • कार्यों एक मॉड्यूल के शीर्ष स्तर पर निर्धारित
    • में निर्मित एक मॉड्यूल के शीर्ष स्तर पर निर्धारित कार्यों
  • वर्गों है कि एक मॉड्यूल
  • उदाहरणों में से के शीर्ष स्तर पर परिभाषित कर रहे हैं ऐसे वर्ग जिनके dict या कॉलस्टेट() को कॉल करने का परिणाम पिकलेबल है (अनुभाग देखें विवरण के लिए अचार प्रोटोकॉल)।

अनप्लिक करने योग्य ऑब्जेक्ट्स को चुनने का प्रयास पिकलिंग एरर अपवाद उठाएगा; जब ऐसा होता है, तो बाइट्स की एक अनिर्दिष्ट संख्या में पहले से अंतर्निहित फ़ाइल में लिखा जा सकता है। एक अत्यधिक रिकर्सिव डेटा संरचना को चुनने की कोशिश कर रहे अधिकतम रिकर्सन गहराई से अधिक हो सकता है, इस मामले में रनटाइमरर उठाया जाएगा। आप sys.setrecursionlimit() के साथ इस सीमा को ध्यान से बढ़ा सकते हैं।

+2

जैसा कि बाद में दस्तावेज़ों में बताया गया है, '__reduce__' और '__setstate__' और' __getstate__' विधियों को मनमाने ढंग से ऑब्जेक्ट्स पिकलेबल बनाने के लिए, या फ़ाइलों के रूप में वैश्विक objets को संदर्भित करने के लिए लगातार आईडी का उपयोग करना भी संभव है। – Ara

1

अंगूठे का सामान्य नियम है कि "तार्किक" वस्तुओं मसालेदार जा सकता है लेकिन "संसाधन" वस्तुओं (फ़ाइलें, ताले) नहीं है, क्योंकि यह कोई मतलब नहीं है लागू करने के लिए/उन्हें क्लोन कर सकते हैं।

+0

मैं असहमत हूं कि यह "कोई समझ नहीं आता"। उदाहरण के लिए, एक मेमोरी-मैप किए गए सरणी को बफर सरणी से अलग कैसे किया जाता है, यह सहेजता है कि इसमें फ़ाइल-बैकएंड है? क्या उन मामलों में समान मामलों में समान व्यवहार नहीं किया जाना चाहिए? –

2

icedtrees 'जवाब के अलावा, यह भी docs से सीधे आ रहा है, तो आप को अनुकूलित और उन्हें नियंत्रित करने वर्ग उदाहरणों मसालेदार कर रहे हैं और बिखरा हुआ है, विशेष तरीकों का उपयोग कर सकते हैं: object.__getnewargs_ex__(), object.__getnewargs__(), object.__getstate__(), object.__setstate__(state)

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