栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

python multiprocessing-OverflowError('无法序列化大于4GiB的字节对象')

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python multiprocessing-OverflowError('无法序列化大于4GiB的字节对象')

显然,有关此主题有一个未解决的问题,并且针对此特定答案描述了一些相关的措施。我根据此答案找到了一种更改库中

pickle
使用的默认协议的方法。正如评论中指出的那样,该解决方案
仅适用于Linux和OS多处理库*
multiprocessing
*

解:

您首先创建一个新的分离模块

pickle4reducer.py

from multiprocessing.reduction import ForkingPickler, AbstractReducerclass ForkingPickler4(ForkingPickler):    def __init__(self, *args):        if len(args) > 1: args[1] = 2        else: args.append(2)        super().__init__(*args)    @classmethod    def dumps(cls, obj, protocol=4):        return ForkingPickler.dumps(obj, protocol)def dump(obj, file, protocol=4):    ForkingPickler4(file, protocol).dump(obj)class Pickle4Reducer(AbstractReducer):    ForkingPickler = ForkingPickler4    register = ForkingPickler4.register    dump = dump

然后,在您的主脚本中,您需要添加以下内容:

import pickle4reducerimport multiprocessing as mpctx = mp.get_context()ctx.reducer = pickle4reducer.Pickle4Reducer()with mp.Pool(4) as p:    # do something

那可能会解决溢出的问题。

但是,警告一下,您可以
在执行任何操作之前考虑阅读此内容,
否则可能会遇到与我相同的错误:

‘i’格式要求-2147483648 <=数字<= 2147483647

(此错误的原因在上面的链接中有很好的说明)。简而言之,如果已经达到极限,则

multiprocessing
使用
pickle
协议通过其所有过程发送数据
4gb
,这可能意味着您可能会考虑将函数更多地定义为“无效”方法,而不是输入/输出方法。所有这些入站/出站数据都会增加RAM使用率,在构造上可能效率低下(我的情况),并且将所有进程都指向同一个对象而不是为每个调用创建一个新副本可能更好。

希望这可以帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574812.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号