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 回答