2017-12-30 46 views
0

다음은 다중 처리 모듈의 풀을 사용하는 병렬 코드입니다. 여기에서 매개 변수 d는 튜플이며 word_number는 정수이고 word_count는 문서입니다.파이썬 다중 처리 cPickle.PicklingError

cPickle.PicklingError: Can't pickle <class '__main__.doc_'>: attribute lookup __main__.doc_ failed 

이 문서와 튜플 내 매개 변수 D의 문제인가 :

def perDoc(d): 
    score = 0.0 
    word_count = d.word_count 
    word_number = d.word_number 
    for i, word in enumerate(q): 
     if word not in corpus_query_min: 
      continue 
     if word not in word_count: 
      frequency = 0 
     else: 
      frequency = word_count.get(word) 
     score += np.log(np.float(frequency + miu * corpus_word_count[i]/corpus_number)/ 
        (word_number + miu)) 
    #loglh[d.docID] = score 
if __name__ == '__main__': 
    pool = Pool(4) 
    pool.map(perDoc, doc_query_list) 
    pool.close() 

는이 같은 오류가있어?

당신이 (아직 아니지만 MCVE) 추가 정보를 준 이후
+0

문제는'doc_query_list'의 내용과 관련이 있습니다 만, 문제는 그것을 생성 한 코드를 제공하지 않았습니다. 도움이 필요하면 [MCVE]를 제공해주십시오. – ShadowRanger

+0

그 부분을 잊어서 죄송합니다. 아래에서 doc_tuple은'collections.namedtuple'입니다. \t'doc_query_list.append (doc_tuple (d.docID, doc_temp, dword_number))' –

+0

@ Yangyang.Guo. 그러나 어떤 유형의 객체가'문서 '입니까? 명명 된 튜플과 그 안에 들어있는 모든 객체의 정의를 표시합니다. – ekhumoro

답변

1

심령 디버깅 :

당신은 doc_tuple의 클래스를 사용하여 만든 :

doc_tuple = collections.namedtuple('doc_', ... attributes here ...) 

전달 된 문자열 이름 ('doc_') 사이의 불일치하고, 이 이름은 (doc_tuple)에 할당되어이 문제를 일으 킵니다. 이라는 두 이름은 namedtuple의 인스턴스가 피클 할 수 있도록과 일치해야합니다. 로 변경 :

# Binding matches name passed to namedtuple constructor now 
doc_tuple = collections.namedtuple('doc_tuple', ... attributes here ...) 

과는 (다른 클래스 또는 함수 내부) 모듈의 최상위 수준에 정의되어 있는지 확인하고 그것을 작동합니다.

+0

예! 이것은 내 문제를 올바르게 해결했다. 그러나 멀티 프로세싱 없이는 코드가 실행될 수 있습니다. 조금 궁금해서. –

+0

@ Yangyang.Guo :'multiprocessing' 함수는 각각의 작업자 작업 호출의 함수, 인수 및 리턴 값을 직렬화해야하며, 산세 처리를 통해 그렇게합니다. 'multiprocessing'이 없다면 데이터는 직렬화되지 않습니다 만, 바인딩의 불일치와 이름을 제공하는 것은 여전히 ​​잘못된 것입니다. 왜냐하면 다른 모든 산세의 사용을 막고 인스턴스의 'repr'을 망쳐 버리기 때문입니다. – ShadowRanger