1

メモリ マップされた .NET ファイル内の場所にソケットから直接読み取ることができるかどうかを知っている人はいますか? それが役立つ場合、これはたまたま非永続的なメモリマップファイルです(純粋にメモリ内にあり、関連するディスクファイルはありません)。

コンテキスト: 分散システムでノード間を移動する大きなメモリ マップ オブジェクトがある状況で、最小限のコピー コードを実装しようとしています。私は標準のソケット ライブラリ経由で UDP を使用しているので、たとえばソケットから 64KB を読み取ることができることを期待していました (私は Infiniband ネットワーク上にいるため、MTU は非常に大きくなる可能性があります)。メモリマップ領域に。

これまでのところ、私が見つけたものはすべて、コピー操作を実行することを伴うようです-最初にデータを読み取り、次にそれをメモリマップされたファイルにコピーします。それが私が避けたいことです:そのコピー操作。実際、送信に関しても同じ問題があります。メモリ マップ ファイルから直接送信したいと考えています。

コピーはささいなことのように思えるかもしれませんが、私が扱っているオブジェクトは巨大です (クラウド シナリオ): バイト配列として扱いたい大量の数ギガバイトのメモリ マップ オブジェクトです。したがって、これらの追加のコピー操作は、私にとって高価になる可能性があります。実際、私の本当の目標は、Infiniband 動詞を使用して、マシン A のメモリ マップ領域からマシン B のメモリ マップ領域に直接 DMA 転送を行い、UDP を完全にバイパスすることです。

任意のポインタは非常に高く評価されます!

(詳細: これらは大規模なクラスター、64 ビット マシン上のアプリケーションです。私のコードは C# で記述された .NET にありますが、これらのメモリ マップ オブジェクトを作成するアプリケーションはほとんどが C++ またはその他の言語で作成されています。これらは Hadoop と考えてください。または Mapreduce タスク、たとえば、巨大な画像としてのファイル、または連結された Web ページなどのようなもの. したがって、これらのアプリケーションはこれらのファイルを生成します (おそらく Map ステップからの出力です)。これは私がやろうとしている具体的なことです...理想的には、.NET の C# が好きなので、コードがまだ .NET/C# に残っている状態が理想的です.Linux 用の Mono でクロスコンパイルしています...実際にこれらのクラスターで実行されるものです)

4

1 に答える 1

0

明らかに、Keith は私に正しい方向を示してくれた功績に値しますが、答えを要約すると、C または C++ で小さなモジュールを作成し、それをコンパイルして、私のアセンブリの一部となる DLL を作成することです。それをロードします (これは動的または静的に行うことができます。もちろん後者の方が簡単です)。その後、C# から C に呼び出すことができ、私の C コードは真のアドレスを使用して生のシステム コールを実行できます。メモリ マップト ファイル (永続ストレージを持たないファイルであっても) は、ガベージ コレクションや統合のために移動しないため、これは非常に簡単なケースです。実際、C コードは C# コードからアドレスを学習する必要さえありません。同じファイルを「再マップ」するだけで済みますが、アドレスを渡すのは簡単なはずです。さらに、これは元の C# コードと同じくらい移植性があります。

対照的に、ヘルパー プロシージャを 1 つまたは 2 つ使用せずにこれを行うと、非常に苦痛になります。

キース、これをあなたの名前で再投稿したい場合は、私の要約を削除し、あなたを一番上に「投票」します(あなたはポイントに値します...)

于 2013-07-18T22:52:45.967 に答える