Python Dataflow Sideinputs—SDK 2.x中的工作缓存大小

Python Dataflow Sideinputs—SDK 2.x中的工作缓存大小,python,google-cloud-dataflow,Python,Google Cloud Dataflow,我在使用~1GB大侧输入的DoFn中遇到性能问题。使用pvalue.AsList()传递side输入,这将强制实现side输入 管道的执行图显示,特定步骤将大部分时间用于读取端输入。读取的数据总量远远超过输入端的大小。因此,我得出结论,即使工作线程的RAM足够(使用带有26 GB RAM的n1-highmem4工作线程),侧输入也不适合工作线程的内存/缓存 我如何知道这个缓存实际上有多大?有没有一种方法可以使用Beam Python SDK 2.15.0来控制其大小(就像Java 1.x SDK

我在使用~1GB大侧输入的DoFn中遇到性能问题。使用pvalue.AsList()传递side输入,这将强制实现side输入

管道的执行图显示,特定步骤将大部分时间用于读取端输入。读取的数据总量远远超过输入端的大小。因此,我得出结论,即使工作线程的RAM足够(使用带有26 GB RAM的n1-highmem4工作线程),侧输入也不适合工作线程的内存/缓存

我如何知道这个缓存实际上有多大?有没有一种方法可以使用Beam Python SDK 2.15.0来控制其大小(就像Java 1.x SDK中有管道选项--workerCacheMb=200)


没有一种简单的方法可以将我的侧边输入压缩到10%以上。

如果您使用的是
AsList
,那么应该将整个侧边输入加载到内存中,这是正确的。可能是您的工作人员有足够的可用内存,但将1GB的数据读入列表只需要很长时间。此外,读取的数据的大小取决于它的编码。如果你能分享关于你的算法的更多细节,我们可以尝试找出如何编写一个运行效率更高的管道



另一种选择可能是使用外部服务来保存您的端输入—例如,您写入的Redis实例位于一端,而红色则位于另一端。

如果您使用的是
AsList
,则应将整个端输入加载到内存中。可能是您的工作人员有足够的可用内存,但将1GB的数据读入列表只需要很长时间。此外,读取的数据的大小取决于它的编码。如果你能分享关于你的算法的更多细节,我们可以尝试找出如何编写一个运行效率更高的管道



另一种选择可能是使用外部服务来保留您的输入—例如,您在一侧写入的Redis实例,另一边是红色。

这是流式管道吗?这是批处理管道。AFAIK默认工作缓存大小为100MBIs这是流式管道吗?这是批处理管道。AFAIK默认工作缓存大小为100MBI通过将侧输入缩减约15%来解决性能问题。然而,我也试图找到一些构建数据流管道的一般设计原则。工人缓存的大小是否有硬性限制,还是只取决于可用内存的多少?在哪种情况下,人们更喜欢使用cogroupbykey转换进行连接,而不是使用带有SideInput的ParDos?在哪种情况下可以使用Redis实例?什么时候(如果有的话)在DoFn的setup()/start\u bundle()方法中加载数据是个好主意?我能够通过将侧输入缩减约15%来解决性能问题。然而,我也试图找到一些构建数据流管道的一般设计原则。工人缓存的大小是否有硬性限制,还是只取决于可用内存的多少?在哪种情况下,人们更喜欢使用cogroupbykey转换进行连接,而不是使用带有SideInput的ParDos?在哪种情况下可以使用Redis实例?什么时候(如果有的话)在DoFn的setup()/start\u bundle()方法中加载数据是个好主意?