gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:25:14 25 4
gpt4 key购买 nike

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

我假设这是因为一般来说指针和 GC 不能很好地相处。

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

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

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

附带说明一下,这不会使 .NET API 对于“共享大量数据”场景毫无用处吗?

最佳答案

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

struct MyDataRecord { public int X, Y; }

...

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

这非常高效,也很方便。

关于c# - 在 C# 中使用内存映射文件时是否可以避免数据副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com