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

2023-11-22

我对内存映射文件在 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(使用前将#替换为@)

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

  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 类型错误:google.visualization.DataTable 不是构造函数

    在我的网页上有一个谷歌地图 以及三个图表 当页面加载时 地图很好 但图表要么不加载 要么只有一两个加载 不断收到错误 TypeError google visualization DataTable 不是构造函数 function load
  • 获取返回 StreamedContent 的 的具体 URL

    为了使用灯箱 我需要一个指向由以下命令生成的图像的链接
  • 如何在另一个 groovy 脚本中简单地导入 groovy 文件

    groovy tree lib GTemplate class GTemplate groovy Simple groovy class GTemplate static def toHtml this newInstance toHtml
  • Android 中的 Base64 图像转换导致图像损坏

    我需要将 JSON 上传到服务器 因此我尝试使用 base64 对其进行编码 然后通过 JSON 发送它 但在服务器端解码图像时 图像显示已损坏 我什至尝试过在线 Base64 到图像转换器 结果是相同的 这是我的活动代码 在从图库或相机中
  • 在 Scala 2.10 中通过反射查找类型参数?

    使用类型标签 我能够see某种类型的参数 scala gt import scala reflect runtime universe import scala reflect runtime universe scala gt typeO
  • 如何从 CMD 运行 Pip 命令

    据我了解 Python 2 7 9 附带安装了 Pip 但是当我尝试从 CMD Windows 执行 Pip 命令时 出现以下错误 pip is not recognized as an internal or external comma
  • 如何在Android Studio中指定JDK版本?

    Android Studio 给我一个 Gradle 构建错误 如下所示 Error 3 22 compileSdkVersion android 22 requires compiling with JDK 7 现在它给了我这些可点击的提
  • 如何正确处理Python中的循环模块依赖?

    尝试找到一种良好且正确的模式来处理 Python 中的循环模块依赖关系 通常 解决方案是删除它 通过重构 然而 在这种特殊情况下 我们确实希望拥有需要循环导入的功能 EDIT 根据下面的答案 此类问题通常的攻击角度是重构 然而 为了这个问题
  • Mac 上的 PDO MySQL 驱动程序

    我有一台大约一年前安装的自定义 PHP 5 的 Mac 我记得我花了整个星期天的时间 编译了大约 20 次才能把它做好 我拥有的 MySQL 来自熵并且是预编译的 现在我需要让 PDO 与 MySQL 驱动程序一起工作 但驱动程序尚未安装
  • 在c二进制中,测试数字是否在范围内

    这是我无法解开的谜题的一部分 该函数接受三个输入 第一个是 int 第二个是下界 第三个是上限 我需要测试第一个数字是否在下限和上限内 包括下限和上限 如果在范围内则返回1 否则返回0 问题是我只能使用 lt lt gt gt 操作 并且只
  • linux、C++、xft:如何使用它?

    我尝试使用 Xft tutorial 好吧 让他们称之为教程 看起来像是在朝鲜营地写的 我也发现了这个one 那么让我尝试一步一步地进行 g XftTest cc lX11 lXft pkg config cflags freetype2
  • 为什么我会收到此 WCF 错误消息?

    当我调用 WCF 服务时 出现以下错误 我在这里缺少什么 System String with data contract name ArrayOfstring http schemas microsoft com 2003 10 Seri
  • DRF 光标分页示例

    我正在尝试设置使用 DRF 进行光标分页获取交易记录列表 按创建日期排序 我不知道如何执行初始请求 因为我在那个阶段还不知道光标 令人惊讶的是 我找不到这方面的例子 另外 有没有办法使用 CursorPagination 设置每个请求的页面
  • SwiftUI @Binding 不刷新视图

    我有一个简单的主 详细信息界面 其中详细信息视图修改数组中的项目 使用下面的代码 模型已正确更新 但 SwiftUI 不会刷新视图以反映更改 Model struct ProduceItem Identifiable let id UUID
  • 插入时保持 std 向量/列表排序,或全部排序

    假设我的向量 列表中有 30000 个对象 这是我一一补充的 我需要将它们分类 一次排序 如 std sort 更快 还是在我一一添加对象时保持向量 列表排序更快 矢量 列表以后不会被修改 当你在一个接一个地插入元素的同时保持向量列表排序时
  • 如何在Flutter中实现持久秒表?

    我正在 flutter 中实现一个计时器 这是应用程序的结构 页面 A 包含一些列表 用户单击这些列表并将其带到计时器页面 页面 B 格式 运行计时器 我能够正确运行计时器 秒表 但是当我按页面 B 上的后退按钮时 我会在处理错误后调用 s
  • Chrome 说:资源解释为样式表,但使用 MIME 类型 application/xml 进行传输

    我有一个使用 XSL 文件设计样式的 XML 文件 在 Firefox 中打开 XML 文件时 我没有遇到任何问题 尽管奇怪的是 有时它只会在我点击 重新加载 后才会显示 但在 Chrome Chromium 中我收到错误消息 Resour
  • SQL Server 日期格式函数

    SELECT CONVERT VARCHAR 10 GETDATE 105 此查询返回 DD MM YYYY 中的日期 格式为 varchar 我需要在 sql server 中的日期时间数据类型中使用相同的格式 请帮助我 在 SQL Se
  • 为什么 lambda 表达式没有被“interned”?

    字符串是引用类型 但它们是不可变的 这使他们能够interned由编译器 只要出现相同的字符串文字 就可能引用相同的对象 委托也是不可变的引用类型 使用以下方法向多播委托添加方法 运算符构成任务 这不是可变性 并且 就像字符串一样 有一种
  • 在 C# 中使用内存映射文件时是否可以避免数据副本?

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