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

时间:2012-05-14 22:27:07

标签: c# performance memory-mapped-files

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

我认为这是因为一般来说,指针和GC并不能很好地融合在一起。

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

struct MyDataRecord { public int X, Y; }

...

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

这非常有效且方便。