在python beam函数中使用不可序列化的对象

在python beam函数中使用不可序列化的对象,python,python-2.7,apache-beam,Python,Python 2.7,Apache Beam,根据beam的文件: 函数对象中的瞬态字段不会传输到worker 实例,因为它们不是自动序列化的 我的代码: class myBeamFunction(beam.DoFn): def __setstate__(self, state): self.__dict__ = state self.my_nonserialisable_object = new Nonserialisable_object() def process(self, ele

根据beam的文件:

函数对象中的瞬态字段不会传输到worker 实例,因为它们不是自动序列化的

我的代码:

class myBeamFunction(beam.DoFn):

    def __setstate__(self, state):
        self.__dict__ = state
        self.my_nonserialisable_object = new Nonserialisable_object()

    def process(self, element):
        return self.my_nonserialisable_object.do(element)
我的申请失败,因为:

RuntimeError: maximum recursion depth exceeded
从stacktrace中,我看到它是由以下原因引起的:

Python/2.7/lib/python/site-packages/apache_beam/internal/pickler.py
我想知道有没有一种方法可以在worker实例中初始化函数所需的所有非序列化变量


谢谢。

这可以通过DoFn.StartBundle方法实现。@

在DoFn.StartBundle中初始化每个DoFn实例中的状态 方法如果初始化不依赖于任何 仅由主程序知道或由早期程序计算的信息 管道操作,但此DoFn的所有实例都是相同的 对于所有程序执行,例如设置空缓存或 初始化常量数据

python中的情况恰好相同。因此,稍加修改:

class myBeamFunction(beam.DoFn):

    def __init__(self):
        self.my_nonserialisable_object = None

    def start_bundle(self, context=None):
         self.my_nonserialisable_object = new Nonserialisable_object()

    def process(self, element):
        return self.my_nonserialisable_object.do(element)