【问题标题】:Suggestion distributed computing, getting data from a stream建议分布式计算,从流中获取数据
【发布时间】:2016-07-22 16:20:22
【问题描述】:

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

现在我的问题是:“在进程之间共享从流中读取的信息的最有效方法是什么?”

附言。进程也可能在通过网络连接的不同计算机中。

这里我列出了一些可能性:

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

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

  1. 写入这么多文件可能会产生开销,并且通过网络发送文件根本没有效率。
  2. 我在进程 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_GatherMPI_Reduce 用于接收来自客户端的数据。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多