您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

显然,有关此主题一个解决的问题,并且针对此特定答案描述了一些相关的措施。我根据此答找到了一种更改库中pickle使用的认协议的方法。正如评论中指出的那样,该解决方multiprocessing

解:

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

pickle4reducer.py

from multiprocessing.reduction import ForkingPickler, AbstractReducer

class 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 pickle4reducer
import multiprocessing as mp
ctx = mp.get_context()
ctx.reducer = pickle4reducer.Pickle4Reducer()

with mp.Pool(4) as p:
    # do something

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

否则可能会遇到与我相同的错误

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

(此错误的原因在上面的链接中有很好的说明)。简而言之,如果已经达到极限,则multiprocessing使用pickle协议通过其所有过程发送数据4gb,这可能意味着您可能会考虑将函数更多地定义为“无效”方法,而不是输入/输出方法。所有这些入站/出站数据都会增加RAM使用率,在构造上可能效率低下(我的情况),并且将所有进程都指向同一个对象而不是为每个调用创建一个新副本可能更好。

希望这可以帮助。

python 2022/1/1 18:28:58 有197人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶