0

Windows 7 で、あるプログラムから別のプログラムに大量のデータ (~10MB) を送信する必要があります。非常に低いシステム負荷で、少なくとも毎秒 1 ギガバイトの総スループットを可能にする方法が必要です。これを単純化するために、すべての BLOB を同じサイズにすることができ、1 つのプログラムを別のプログラムの子プロセスにすることができます。

方法 1:両方のプログラムで同じファイルをメモリ マップする: CreateFileMapping() / MapViewOfFile()

この場合、メモリ マップされたファイルには、リング バッファーに複数の BLOB 用のスペースが含まれていると考えられます。リング バッファへのアクセスを同期するには、何らかの外部メカニズムが必要です。

方法 2:名前付きデータ セクションを作成する

方法 3: WriteProcessMemory (以下の Hristo Iliev の提案、ありがとう!)

方法 4: RAM ディスク上のファイルの読み取り/書き込み。

方法 5: 匿名パイプへの読み取り/書き込み。

方法 ?: 他に何か? おそらくTCPを介して書き込み、MPIを使用します...

私は、メモリ マップト ファイル (方法 1) がこの問題の標準的な解決策と見なされていることを知っています :)

  • メモリ マップト ファイルの速度は? (大まかなオーダー)

  • もっと速い方法はありますか?

  • 他の方法のパフォーマンスはどれくらい悪いですか? GB/秒のスループットを達成できるのはどれですか?

  • メモリ マップされたファイルを使用している場合、プログラムが渡されるデータへのアクセスを同期するための最良の方法は何ですか? (つまり、プロデューサーは新しい BLOB が利用可能であることをコンシューマーにどのように示し、コンシューマーは特定の BLOB でそれが完了したことをどのように示すでしょうか?)

  • メモリ マップ ファイルを使用する場合、すべての BLOB をまとめて 1 つのファイル (ファイル内のリング バッファー) と、BLOB ごとに 1 つのファイル (ファイルのリング バッファー) のどちらを使用するのがよいでしょうか?

4

1 に答える 1

2

また、 WriteProcessMemoryを使用して、最初のプロセスでデータを 2 番目のプロセスのアドレス空間に直接ポストすることもできます。何らかのプロトコルを開発する必要があります。たとえば、2 番目のプロセスは、その受信バッファーの仮想アドレスを、名前付きパイプまたは共有メモリ ブロックを介して最初のプロセスに送信できます。次に、最初のプロセスは、使用してデータをコピーし、WriteProcessMemoryそれが終了すると、セマフォを介して 2 番目のプロセスに通知します。か何か。これは、単一のコピー操作を伴うため、2 つのプロセス間でデータを送信する最速の方法であるはずです。最初のプロセスは、2 番目のプロセスで適切な権限を取得する必要がありますが、両方のプロセスが同じユーザーに属している限り、問題はありません。

于 2012-11-29T15:04:01.093 に答える