当前位置: 首页 > 知识库问答 >
问题:

速度和内存的折衷将Apache Beam PCollection一分为二

柳俊彦
2023-03-14

我有一个PCollection,其中每个元素都是一个键,值元组如下:(key,(value1,..,value_n))

class SplitInTwo(beam.DoFn):

   def process(self, kvpair):
       key, values = kvpair
       
       yield beam.TaggedOutput('left', (key, values[0:2]))
       yield beam.TaggedOutput('right', (key, values[2:]))

class ProcessLeft(beam.DoFn):
   def process(self, kvpair):
       key,values = kvpair
       ...
       yield (key, results)

# class ProcessRight is similar to ProcessLeft
   splitme = pcoll | beam.ParDo(SplitInTwo()).with_outputs('left','right')
   left = splitme.left | beam.ParDo(ProcessLeft())
   right = splitme.right | beam.ParDo(ProcessRight())
class ProcessLeft(beam.DoFn):

   def process(self, kvpair):
       key = kvpair[0]
       values = kvpair[0][0:2]
       ...
       yield (key,result)

# class ProcessRight is similar to ProcessLeft

   left = pcoll | beam.ParDo(ProcessLeft())
   right = pcoll| beam.ParDo(ProcessRight())

但是...更快吗?会比第一个需要更少的内存吗?

(我在考虑第一个选项可能由跑步者融合--不仅仅是数据流跑步者)。

共有1个答案

鲁浩渺
2023-03-14

在这种情况下,这两个选项都将被runner融合,因此这两个选项在性能方面有点相似。如果您希望将数据重新洗牌到单独的工作者中,那么选项1是最佳选择,因为processleftprocessright读取的序列化集合会更小。

   splitme = pcoll | beam.ParDo(SplitInTwo()).with_outputs('left','right')
   left = splitme.left | beam.Reshuffle() | beam.ParDo(ProcessLeft())
   right = splitme.right | beam.Reshuffle() | beam.ParDo(ProcessRight())

reshuffle转换将确保将数据写入中间洗牌,然后在下游使用。这会破坏聚变。

 类似资料:
  • 问题内容: 在Java中能否确定可用的总CPU速度以及系统总内存?到网络的网络连接速度也很棒。 问题答案: 这实际上取决于您的操作系统,因为Java将告诉你 一点 关于底层机器。不幸的是,根据您的操作系统,您必须使用不同的方法。 如果您使用的是Linux,请查看文件系统以获取CPU信息。通常具有丰富的信息。网络(IO)将通过命令反映出来。 如果您使用的是Windows,WMI是一个有用的工具,它可

  • 问题内容: 我有一个具有以下布局的表: 我想将表转换为如下所示的布局: 我在PostgreSQL中使用SQL。有没有一种简单的方法(且内存效率高)来做到这一点?我看过一些提到使用透视的帖子,但是我不确定这是否行得通,而且我看到的描述似乎是针对Oracle的。 问题答案: 如果尚未安装,请首先安装扩展tablefunc。每个数据库需要做一次。 你需要的PostgreSQL 9.1 的。在旧版本中,您

  • 关于C++中的类和结构之间的区别,人们已经问了几个问题。引用最多的区别是缺省可见性不同。就连斯特鲁斯特鲁普似乎也在暗示,基本上没有什么区别。 我认为我的问题不是重复的,因为我想问一些具体而及时的问题:使用结构来对付类在速度、内存使用或效率方面是否有任何影响?偏爱一个而不是另一个能基于那些东西的任何优点吗? 作为参考,我正在评估一个人专门使用结构的C++代码,并将其移植到一个资源有限的ARM体系结构

  • 问题内容: 在linux系统中,pthreads库为我们提供了用于对齐缓存的功能(posix_memalign),以防止错误共享。要选择架构的特定NUMA节点,我们可以使用libnuma库。我想要的是同时需要两者的东西。我将某些线程绑定到某些处理器,并且我想为来自相应NUMA节点的每个线程分配本地数据结构,以减少线程的内存操作延迟。我怎样才能做到这一点? 问题答案: 如果您只是希望围绕NUMA分配

  • 我想了解为什么多次动态分配调用的数据比直接在代码中指定的或通过的单个调用分配的数据使用如此多的内存。 例如,我用C编写了以下两个代码: 测试1.c:int x用malloc分配 我在这里没有使用free来保持简单。当程序等待交互时,我查看另一个终端中的顶级功能,它向我显示了以下内容: test2. c: int x不是动态分配的 顶部显示: 我还编写了第三个代码,其结果与test2相同,我在tes

  • 我在输入流(来自键盘)中大约有行。我是这样读的: 是要读取的行数。是我在其他地方定义的。 这个方法正在做的工作,但我想加快它。我想过使用缓冲区将整个流读取到内存中并进行解析,但我不知道如何使用C++11来实现这一点。 我使用读取流,因为它似乎比C++流读取器快。否则,我更喜欢C++11解决方案。