首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python多处理cPickle.PicklingError

python多处理cPickle.PicklingError
EN

Stack Overflow用户
提问于 2017-12-30 02:52:19
回答 2查看 353关注 0票数 0

下面是我使用多处理模块的池的并行代码。这里,参数d是一个元组,其word_number是一个整数,而word_count是一个文档。

代码语言:javascript
复制
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()

我犯了这样的错误:

代码语言:javascript
复制
cPickle.PicklingError: Can't pickle <class '__main__.doc_'>: attribute lookup __main__.doc_ failed

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-30 03:15:39

心灵调试,因为你提供了更多的信息(但仍然没有MCVE):

您创建doc_tuple的类时:

代码语言:javascript
复制
doc_tuple = collections.namedtuple('doc_', ... attributes here ...)

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

代码语言:javascript
复制
# Binding matches name passed to namedtuple constructor now
doc_tuple = collections.namedtuple('doc_tuple', ... attributes here ...)

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

票数 1
EN

Stack Overflow用户

发布于 2019-07-03 16:57:45

如果您的脚本中有一个import ipdb,请删除它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48030522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档