python多处理cPickle.PicklingError

python多处理cPickle.PicklingError,python,multiprocessing,Python,Multiprocessing,下面是我使用多处理模块池的并行代码。这里,参数d是一个元组,它的word\u number是一个整数,word\u count是一个文档 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: co

下面是我使用多处理模块池的并行代码。这里,参数d是一个元组,它的word\u number是一个整数,word\u count是一个文档

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()
我得到的错误如下:

cPickle.PicklingError: Can't pickle <class '__main__.doc_'>: attribute lookup __main__.doc_ failed
cPickle.PicklingError:无法pickle:属性查找\uuuu main\uuuuu.doc\uu失败

这是我的参数d是一个带有文档的元组的问题吗?

心理调试,因为您提供了更多信息(但仍然不是MCVE):

您使用以下内容创建了
文档组的类:

doc_tuple = collections.namedtuple('doc_', ... attributes here ...)
传递的字符串名称(
'doc\u'
)与分配给它的名称(
doc\u tuple
)之间的不匹配导致此问题;这两个名称必须匹配,才能对
namedtuple
的实例进行pickle处理。将其更改为:

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

并确保它是在模块的顶层定义的(不是在另一个类或函数中),并且应该可以工作。

如果脚本中有
导入ipdb
,请将其删除。

您的问题与
文档查询列表的内容有关,但您尚未提供创建它的代码。如果您需要帮助,请提供一个帮助。很抱歉忘记了这一部分。下面,doc\u tuple是一个
集合。命名为tuple
doc\u query\u list.append(doc\u tuple(d.docID,doc\u temp,d.word\u number))
@Yangyang.Guo。但是
文档是什么类型的对象?显示namedtuple及其包含的所有对象的定义。@ekhumoro
d.word\u count
是一个文档<代码>键
是单词,
是频率。耶!这正确地解决了我的问题。但是如果没有多处理,代码可以运行。有点奇怪。@Yangyang.Guo:
多处理
必须序列化您所做的每个辅助任务调用的函数、参数和返回值,并且它通过pickle来实现。如果没有
多处理
,数据永远不会序列化,但绑定和提供的名称不匹配仍然是错误的,因为它也阻止了所有其他酸洗的使用,弄乱了实例的
repr
,等等。