5

C# でメモリ マップされたファイルがどのように機能するかについての私の理解は、データに対するすべての要求がコピーになるということです。たとえば、大きなデータ構造をファイルとして保持している場合、メモリ マップ ファイルを使用すると、RAM にマップされた実際のファイルのメモリが発生し、ファイルから読み取られたコピーが GC ヒープに存在します。

これは、一般的に言えば、ポインターと GC がうまく調和しないためだと思います。

それで、これを回避する方法はありますか?

  • おそらく、メモリ マップされたデータを介してマネージ API を公開できる混合モード C++ を介してですか?
  • 安全でない C# での直接ポインター操作はどうですか?

私が解決しようとしている一般的な問題は、複数のプロセス間で大きなデータ構造を共有することです。データ構造は、単純な API (つまり、基本的には、他のデータの束の高度に特殊化されたインデックス) として公開できる小さな一連の「質問」に答えるために使用されます。

余談ですが、これにより、.NET API は「大量のデータを共有する」シナリオでは役に立たなくなりませんか?

4

1 に答える 1

4

アンセーフ コードを使用して、マップされたメモリに直接アクセスできます。変更せずにメモリ内でコピーできる構造体型である「blittable structs」を調べることをお勧めします。次に例を示します。

struct MyDataRecord { public int X, Y; }

...

for (var i = 0 .. 10) {
 ((MyDataRecord*)pointerToUnmanagedMemory)[i] = new MyDataRecord() { X = i, Y = i * i };
}

これは非常にパフォーマンスが高く、便利です。

于 2012-05-14T22:32:12.457 に答える