メモリ マップされた .NET ファイル内の場所にソケットから直接読み取ることができるかどうかを知っている人はいますか? それが役立つ場合、これはたまたま非永続的なメモリマップファイルです(純粋にメモリ内にあり、関連するディスクファイルはありません)。
コンテキスト: 分散システムでノード間を移動する大きなメモリ マップ オブジェクトがある状況で、最小限のコピー コードを実装しようとしています。私は標準のソケット ライブラリ経由で UDP を使用しているので、たとえばソケットから 64KB を読み取ることができることを期待していました (私は Infiniband ネットワーク上にいるため、MTU は非常に大きくなる可能性があります)。メモリマップ領域に。
これまでのところ、私が見つけたものはすべて、コピー操作を実行することを伴うようです-最初にデータを読み取り、次にそれをメモリマップされたファイルにコピーします。それが私が避けたいことです:そのコピー操作。実際、送信に関しても同じ問題があります。メモリ マップ ファイルから直接送信したいと考えています。
コピーはささいなことのように思えるかもしれませんが、私が扱っているオブジェクトは巨大です (クラウド シナリオ): バイト配列として扱いたい大量の数ギガバイトのメモリ マップ オブジェクトです。したがって、これらの追加のコピー操作は、私にとって高価になる可能性があります。実際、私の本当の目標は、Infiniband 動詞を使用して、マシン A のメモリ マップ領域からマシン B のメモリ マップ領域に直接 DMA 転送を行い、UDP を完全にバイパスすることです。
任意のポインタは非常に高く評価されます!
(詳細: これらは大規模なクラスター、64 ビット マシン上のアプリケーションです。私のコードは C# で記述された .NET にありますが、これらのメモリ マップ オブジェクトを作成するアプリケーションはほとんどが C++ またはその他の言語で作成されています。これらは Hadoop と考えてください。または Mapreduce タスク、たとえば、巨大な画像としてのファイル、または連結された Web ページなどのようなもの. したがって、これらのアプリケーションはこれらのファイルを生成します (おそらく Map ステップからの出力です)。これは私がやろうとしている具体的なことです...理想的には、.NET の C# が好きなので、コードがまだ .NET/C# に残っている状態が理想的です.Linux 用の Mono でクロスコンパイルしています...実際にこれらのクラスターで実行されるものです)