gpt4 book ai didi

c# - 如何并行处理内存映射文件中的数据

转载 作者:可可西里 更新时间:2023-11-01 08:24:02 28 4
gpt4 key购买 nike

正如内存映射文件的名称所示,我知道可以使用 C# 中的 MemoryMappedFile 类将大文件的一部分映射到内存,以实现快速数据处理。我想对内存映射文件做的是并行处理内存映射。为了做到这一点,我有以下问题

  1. MemoryMappedFileViewAccessor 是线程安全的还是 Parallel.For 安全的?我实际上制作了一个演示程序来测试这个问题,它似乎在工作。但是找不到关于此的任何引用。如果答案是肯定的,我就完成了。否则,
  2. 有什么方法可以直接访问数组映射的内存吗?我知道 MemoryMappedFileViewAccessor 有 ReadArray 方法,但使用该方法是内存的重复。

最佳答案

你可以推理出这一点。内存映射文件只是程序中的一 block 内存,其字节可由多个进程访问。它们在托管代码中非常笨拙,因为这个 block 存在于特定地址。这需要使用指针访问数据,它们在托管代码中是禁忌的。 MemoryMappedFileViewAccessor 包装该指针,它将数据从托管内存复制 到共享内存。请注意,这违背了使用 MMF 的主要原因,以及为什么他们的支持花了这么长时间才出现在 .NET 中。请确保您不想改用命名管道。

因此推理出来,MMF 在设计上肯定不是线程安全的,因为这是共享内存,就像代码中的全局变量一样。如果线程读取和写入共享内存的同一部分,事情就会以完全相同的方式出错。而且您还必须完全相同地防止这种情况,一种确保只有一个线程可以访问共享部分的锁。

另请注意,您需要在读取和写入 MMF 的进程之间实现该锁定。这往往很痛苦,您必须使用“主”进程创建并打开“从”进程的命名互斥锁。您不能忽略该锁定要求。值得注意的是,您从未在问题中提到要处理这个问题,所以这里有红旗。

在一个进程中,不访问 MMF 同一部分的线程不能互相妨碍。就像访问不同 变量的两个线程不需要任何同步。只要它们持有确保另一个进程无法写入该部分的互斥锁。请注意,这可能意味着您要使用信号量来保护 MMF 访问,互斥量只能由一个线程获取。

关于c# - 如何并行处理内存映射文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16351747/

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