2013-02-07 7 views
5

Windows上でC++で実行される2つの実行ファイルがあります。私は1つのデータを生成し、このデータを処理するために他の実行可能ファイルを呼びたいと思います。私は、データをファイルに書き出して、他の実行可能ファイルで読み込むことができましたが、ディスクI/Oに関してはかなり高価です。これを行う良い方法は何ですか?それは十分な簡単な質問のように思えるが、Googleはちょうど助けていない!実行ファイル間のデータ転送

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

32ビットプロセスと64ビットプロセスを混在させると効果が出る回答には、ボーナスポイントがあります。

+3

名前付きパイプ、ローカルwinsockets、メモリマップファイル、共有メモリ、メールスロット、レジストリ、ウィンドウメッセージ(大きなデータには適していません)、その他は何ですか?好きなのを選びな。データ(サイズなど)とデータを共有したい性質についてもう少し詳しくお伝えいただければ、どの方法が最も良いかについて、より良い助言を与えることができます。 – thang

+1

一般に、これは[プロセス間通信](http://en.wikipedia.org/wiki/Interprocess_communication)と呼ばれています。 – Oswald

+0

確かに、データに関する少しの情報を追加しました。もともと、私はちょうど "大量"を書いていましたが、投稿する前に私の質問を編集しました。私は実際にいくつかの数字を与えてください:) –

答えて

4

プロセスがファイルへの書き込みと読み込みを簡単に行うことができれば、すぐに進んでください。 CreateFileでファイルを作成し、一時的に&を共有可能とマークします。 Windowsはこのヒントを使用して物理的な書き込みを遅延させますが、すべてのファイルセマンティクスは引き続き適用されます。あなたのファイルはわずか100 MBで、積極的に使用されているので、Windowsはほとんどその内容をRAMに完全に保存することができます。

+0

私はこのようなキャッシュがこのような信頼性があるかどうかはわかりませんでした。間違いなく最も簡単なソリューション、ありがとう:) –

3

Boost.MPIを使用できます。これは、高い品質基準を持っているブースト、からである、とのコードサンプルはかなり明白なようだ:(つまり、あなたが必要としない

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; 
} 
+0

ブーストは決して私を驚かせることを止めません!これは良い選択肢のように思えます。特に複数のマシンで動作するように拡張している場合は、MSaltersが提案するように、ファイルキャッシュに依存するより簡単なオプションを使用します。 –

1

は、あなただけの「一つの方向を」行ってみたいと仮定すると、子プロセスからデータBACKを取得するには、_popen()を使用できます)。パイプにデータを書き込み、子プロセスはstdinからデータを読み込みます。

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

第3のオプションは、shared memory領域です。私はこれをWindowsでやったことはありませんが、原則は私がLinuxで使ってきたものと同じです。 1.親で指定された名前のメモリ領域を作成してくださいプロセス。 2.子プロセスが同じメモリ領域を開きます。 3.データは、親プロセスによって格納され、子プロセスによって読み取られます。 4.必要に応じて、セマフォーまたは同様のものを使用して、完了/結果準備完了/などを通知することができます。

+1

私は何か新しいことを学んだ:)ありがとう!パイプは良い選択肢のように聞こえるが、私は共有メモリが32と64ビットのプロセスを混在させるときにはうまくいかない共有アドレス空間を意味すると推測している。 –

+0

私が試したことはありませんが、わかりませんが、名前付き共有メモリを使用し、32ビット(2GB未満)のアドレス制限を超えない限り、動作するはずです。共有メモリ内にポインタを置かないように注意してください。メモリは、同じアドレスで(必ず)共有されるわけではありません。 –

+0

ああ、私はコードサンプルを誤解しました。はい、それはそのように動作するように見えます。ありがとうx2! –