python多处理cPickle.PicklingError

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多处理cPickle.PicklingError相关的知识,希望对你有一定的参考价值。

下面是我使用多处理模块池的并行代码。这里,参数d是元组,其word_number是整数,word_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

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

答案

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

您创建了doc_tuple的类:

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

传递的字符串名称('doc_')与分配给它的名称(doc_tuple)之间的不匹配会导致此问题;这两个名称必须匹配namedtuple的实例才能成为pickleable。将其更改为:

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

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

以上是关于python多处理cPickle.PicklingError的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 多处理屏障

Python 硒多处理

如何结合python多处理和管道技术?

python多进程处理数据

Python 子进程、通信和多处理/多线程

python是不是支持多处理器/多核编程?