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

本文关键字:是否 可以避免 数据 副本 文件 映射 内存 | 更新日期: 2023-09-27 18:34:05

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

我假设这是因为指针和 GC 通常不能很好地相处。

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

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

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

附带说明一下,这是否会使 .NET API 对于"共享大量数据"方案毫无用处?

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

您可以使用不安全的代码直接访问映射的内存。我建议您研究"可 blitable structs",它们是无需修改即可在内存中复制的结构类型。下面是一个示例:

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

这是非常高性能和方便的。