【问题标题】:Suggestion distributed computing, getting data from a stream建议分布式计算,从流中获取数据
【发布时间】:2016-07-22 16:20:22
【问题描述】:
在我的软件中,我使用进程 1 从流 X(另一个进程的标准输出)读取信息,然后将读取的信息发送到另一个 N -1 个进程,最后我在进程 1 中收集了由 N 个进程详细说明的所有数据。
现在我的问题是:“在进程之间共享从流中读取的信息的最有效方法是什么?”
附言。进程也可能在通过网络连接的不同计算机中。
这里我列出了一些可能性:
- 计算流的行数(M行),保存到N个文件M/N
行并发送到每个进程 1 个文件。
- 统计流的行数(M行),分配足够的内存来包含所有信息,将信息直接发送给每个进程。
但我认为这些可能是一些问题:
- 写入这么多文件可能会产生开销,并且通过网络发送文件根本没有效率。
- 我在进程 1 中需要足够的内存,因此该进程可能会成为瓶颈。
你有什么建议,你有更好的想法吗?
我在 C 上使用 MPI 进行此计算。
【问题讨论】:
标签:
c
mpi
stdout
distributed-computing
【解决方案1】:
如果性能不是问题,使用文件就可以了。优点是,您可以将所有文件与文件模块化作为解耦接口。你甚至可以使用非常简单的命令行工具:
./YOUR_COMMAND > SPLIT_ALL
split -n l/$(N) -d SPLIT_ALL SPLIT_FILES
在你的 shell 中设置 N 或适当地替换。
注意:不幸的是,在这种情况下,您不能直接通过管道输入split,因为它无法确定从标准输入读取时的总行数。如果轮询,而不是连续拆分很好,您可以直接管道:
./YOUR_COMMAND | split -n r/$(N) -d - SPLIT_FILES
您的第二个解决方案也很好 - 如果您有足够的内存。请记住使用适当的集体操作,例如MPI_Scatter(v) 用于发送,MPI_Gather 或 MPI_Reduce 用于接收来自客户端的数据。
如果内存不足,则以块(例如 100,000 行)缓冲输入,然后将块分散到您的工作人员,计算,收集结果,然后重复。