我对内存映射文件在C#中如何工作的理解是每个数据请求都会产生一个副本。例如,如果您将大型数据结构保留为文件,则使用内存映射文件将导致映射到RAM的实际文件的内存,以及从文件读取后驻留在GC堆中的副本。
我认为这是因为一般来说,指针和GC并不能很好地融合在一起。
那么,有什么方法可以解决这个问题吗?
我想解决的一般问题是在多个进程之间共享一个大型数据结构。数据结构用于回答一小部分“问题”,这些问题可以作为简单的API公开(即基本上是一堆其他数据的高度专业化的索引)。
另一方面,这不会使.NET API对“共享大量数据”场景无用吗?
答案 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 };
}
这非常有效且方便。