大numpy矩阵作为数据流侧输入

时间:2017-05-13 21:59:29

标签: google-cloud-dataflow apache-beam

我试图在Python中编写一个Dataflow管道,需要一个大的numpy矩阵作为边输入。矩阵保存在云存储中。理想情况下,每个Dataflow工作人员都会直接从云存储中加载矩阵。

我的理解是,如果我说matrix = np.load(LOCAL_PATH_TO_MATRIX),然后

p | "computation" >> beam.Map(computation, matrix)

矩阵从笔记本电脑发送到每个Datflow工作人员。

我怎样才能指导每个工作人员直接从云存储中加载矩阵?是否存在"二进制blob"?

的光束源

1 个答案:

答案 0 :(得分:5)

你的方法是正确的。

在这种情况下,数据流的作用是将NumPy矩阵作为侧输入处理。这意味着它会从您的计算机上传到服务一次,Dataflow服务会将其发送给每个工作人员。

鉴于矩阵很大,这将使您的工作人员使用I / O从服务接收它,并承担将整个矩阵保留在内存中的负担,但它应该有效。

如果您想避免在机器中计算/加载矩阵,可以将矩阵作为文本文件上传到GCS,读取该文件并获取矩阵。你可以这样做:

matrix_file = 'gs://mybucket/my/matrix'
p | beam.ParDo(ComputationDoFn(matrix_file))

你的DoFn可能是这样的:

class ComputationDoFn(beam.DoFn):
  def __init__(self, matrix_file):
    self._matrix_file = matrix_file
    self._matrix = None

  def start_bundle(self, element):
    # We check because one DoFn instance may be reused
    # for different bundles.
    if self._matrix is None:
      self.load_matrix(self._matrix_file)

  def process(self, element):
    # Now process the element

  def load_matrix(self, matrix_file):
    # Load the file from GCS using the GCS API

我希望这是有道理的。如果您觉得需要更多帮助,我可以充实这些功能。