建议分布式计算,从流中获取数据

Suggestion distributed computing, getting data from a stream

在我的软件中,我使用进程 1 从流 X(另一个进程的标准输出)读取信息,然后发送信息读取其他 N-1 进程,最后我在进程 1 中收集了 N[=38= 详细说明的所有数据] 进程。

现在我的问题是:"What's the most efficient way to share the information read from the stream between processes?"

PS。进程也可能位于通过网络连接的不同计算机中。

这里我列出一些可能性:

  1. 计算流的行数(M行),保存到N个文件M/N 行并发送给每个进程 1 个文件。
  2. 计算流的行数(M行),分配足够的内存来包含所有信息,直接将信息发送给每个进程。

但我认为这些可能是一些问题:

  1. 写入如此多的文件可能会产生开销,并且通过网络发送文件根本没有效率。
  2. 我在进程 1 中需要足够的内存,因此该进程可能成为瓶颈。

你有什么建议,你有更好的想法吗? 我在 C 上使用 MPI 来进行计算。

如果性能不是问题,使用文件就好了。优点是,您可以将所有文件作为解耦接口保持模块化。您甚至可以使用非常简单的命令行工具:

./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_GatherMPI_Reduce 用于从客户端接收数据。

如果您 运行 内存不足,则将输入缓冲为块(例如 100,000 行),然后将块分散给您的工作人员,计算,收集结果,然后重复。