5

Windows上でC++で記述された2つの実行可能ファイルがあります。一方でいくつかのデータを生成し、もう一方の実行可能ファイルを呼び出してこのデータを処理したいと思います。データをファイルに書き込んでから他の実行可能ファイルで読み取ることもできますが、ディスクI/Oの観点からはかなりコストがかかるようです。これを行うためのより良い方法は何ですか?簡単な質問のようですが、グーグルは役に立たないだけです!

データが約100MBであり、送信が必要になる前に全体が生成されたとします(つまり、ストリーミングは必要ありません)。

32ビットプロセスと64ビットプロセスを混合するときに機能する回答は、ボーナスポイントを獲得します。

4

3 に答える 3

5

プロセスがファイルへの書き込みとファイルからの読み取りを簡単に行える場合は、先に進んでください。でファイルを作成し、CreateFile一時的で共有可能としてマークします。Windowsはこのヒントを使用して物理的な書き込みを遅らせますが、すべてのファイルのセマンティクスは引き続き守られます。ファイルはわずか100MBであり、アクティブに使用されているため、Windowsはほぼ確実にその内容をRAMに完全に保持できます。

于 2013-02-07T14:26:31.390 に答える
3

Boost.MPIを使用できます。高品質の標準を持つBoostからのもので、コードサンプルはかなり明示的です:

http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point

// The following program uses two MPI processes to write "Hello, world!"
// to the screen (hello_world.cpp):

int main(int argc, char* argv[])
{
  mpi::environment env(argc, argv);
  mpi::communicator world;

  if (world.rank() == 0) {
    world.send(1, 0, std::string("Hello"));
    std::string msg;
    world.recv(1, 1, msg);
    std::cout << msg << "!" << std::endl;
  } else {
    std::string msg;
    world.recv(0, 0, msg);
    std::cout << msg << ", ";
    std::cout.flush();
    world.send(0, 1, std::string("world"));
  }
  return 0;
}
于 2013-02-07T12:25:58.567 に答える
1

「一方向」だけに行きたい (つまり、子プロセスからデータを取得する必要がない) と仮定すると、_popen(). データをパイプに書き込むと、子プロセスが からデータを読み取りますstdin

双方向のデータ フローが必要な場合は、2 つのパイプ (1 つは入力として、もう 1 つは出力として) を使用する必要があります。また、子プロセスがこれらのパイプに接続する方法のスキームを設定する必要があります [ stdin/stdout をデータ パスにしますが、名前付きパイプのペアを使用することもできます]。

3 番目のオプションは、共有メモリ領域です。Windows でこれを行ったことはありませんが、原則は Linux で使用したものとほとんど同じです [そして何年も前に OS/2 で]: 1. 親プロセスで指定された名前のメモリ領域を作成します。 . 2. 子プロセスが同じメモリ領域を開きます。3. データは親プロセスによって保存され、子プロセスによって読み取られます。4. 必要に応じて、セマフォなどを使用して、完了/結果の準備ができたことなどを知らせることができます。

于 2013-02-07T12:28:15.957 に答える