我正在尝试使用apachebeam来并行化模拟的N
试验。这个模拟是在一个矩阵V
上运行的,该矩阵来源于.mat
MATLAB文件。我的第一直觉(请原谅,我对apachebeam/Dataflow不熟悉)是扩展FileBasedSource
,但进一步的调查使我确信事实并非如此。最明显的是,Apache Beam documentation表示,“如果您想使用源API提供的高级功能,您应该创建一个新的源代码”,而且我不需要它们中的任何一个—我只想读取一个变量(或几个变量)!我最终偶然发现了https://stackoverflow.com/a/45946643,这就是我现在打算如何得到V
(将结果类似文件的对象从FileSystems.open
传递到scipy.io.loadmat
)。在
下一个问题是如何创建PCollection
的N
排列。显而易见的解决方案是beam.Create([permutation(V) for _ in xrange(N)])
。然而,我对the documentation中的评论有点反感,“后者主要用于测试和调试目的。”也许稍微有一点改进是在DoFn
中执行置换。在
我还有最后一个主意。这听起来有点愚蠢(很可能很愚蠢),但请听我说完这一点(幽默我睡眠不足的自我)。The documentation指向CountingSource
(以及ReadFromCountingSource
)的实现。使用ReadFromCountingSource(N)
比使用beam.Create(range(N))
有什么好处吗?如果是这样,以下(a的开头)Pipeline
是否合理:
(p | 'trial_count' >> ReadFromCountingSource(N)
| 'permute_v' >> beam.FlatMap(lambda _, x: permutation(x), V)
| ...)
束流/数据流专家,你有什么建议?在
谢谢你!!在
让我重新表述一下我认为你在问什么,如果我错了,请纠正我:
在MATLAB文件中有一个矩阵
V
,需要读入该矩阵,然后运行模拟的N
试验。在编辑:
FileBasedSource
不能直接使用。我已经更正了下面的解释。apachebeam有内置的PTransforms来读取许多文件格式,但没有MATLAB文件。您需要创建自己的源实现并读取转换。有很多基于} 和{a2}。在
FileBasedSource
的例子,比如^{Beam文档提供了实现新的I/O转换的技巧:https://beam.apache.org/documentation/io/authoring-overview/
如果与源代码解耦,则添加置换逻辑将更简单。如果试验次数
N
是静态的或在管道构建过程中已知的,则可以使用FlatMap和普通Python代码返回每个置换的iterable。所以你的逻辑看起来更像:要将矩阵从
.mat
文件加载到PCollection
,请从beam.Create
派生一个PTransform
包装器scipy.io.loadmat
:按如下方式调用此转换:
^{pr2}$相关问题 更多 >
编程相关推荐