是否有可能在C#中使用内存映射文件时,避免数据的副本?(Is it possible to avoi

2019-06-24 10:43发布

我的内存映射文件在C#中是如何工作的理解是,在拷贝数据结果每一个要求。 举例来说,如果你有一个大的数据结构,坚持为一个文件,使用内存映射文件会导致内存映射到RAM中的实际文件,和居住在GC堆一次性复制它从文件中读取。

我假设这是因为指针和GC不相处在一起一般来说。

那么,有没有解决这个办法吗?

  • 或许通过一些混合模式C ++,可以暴露在存储器映射的数据被管理的API?
  • 什么不安全的C#直接的指针操作?

我试图解决的普遍问题是共享多个进程之间存在较大的数据结构。 数据结构被用于回答一小部分可以被暴露为一个简单的API“问题”(即,基本上,一群其他数据中的一个高度专业化的索引)。

在一个侧面说明,不这样做的.NET API无用的“共享大量数据”的情况?

Answer 1:

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

struct MyDataRecord { public int X, Y; }

...

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

这是非常高性能和那种方便。



文章来源: Is it possible to avoiding copies of data when using memory mapped files in C#?