在C#中使用内存映射文件时是否可以避免数据副本?

我对内存映射文件如何在C#中工作的理解是每个数据请求都会产生一个副本。 例如,如果您将大型数据结构保留为文件,则使用内存映射文件将导致映射到RAM的实际文件的内存,以及从文件读取后驻留在GC堆中的副本。

我假设这是因为指针和GC一般来说并不能很好地相处。

那么,有什么方法可以解决这个问题吗?

  • 也许通过一些混合模式C ++可以通过内存映射数据公开托管API?
  • 用不安全的C#直接指针操作怎么样?

我试图解决的一般问题是在多个进程之间共享一个大型数据结构。 数据结构用于回答一小部分“问题”,这些问题可以作为一个简单的API公开(即基本上是一堆其他数据的高度专业化的索引)。

另外,这不会使.NET API对“共享大量数据”场景无用吗?

您可以使用不安全的代码直接访问映射的内存。 我建议你研究一下“blittable结构”,它们是结构类型,可以在内存中复制而无需修改。 这是一个例子:

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

这是非常高效和方便的。