我对内存映射文件在 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 };
}
这是非常高效且方便的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)