如何在内存映射文件中并行处理数据

Tae*_*hin 12 c# memory-mapped-files

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

  1. MemoryMappedFileViewAccessor线程安全的还是Parallel.For-safe?我实际上制作了一个演示程序来测试这个问题,它似乎正在起作用.但是找不到任何关于此的参考.如果答案是肯定的,我就完成了.除此以外,
  2. 有没有办法直接访问与数组映射的内存?我知道MemoryMappedFileViewAccessor有ReadArray方法,但使用该方法是重复内存.

Han*_*ant 10

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

因此推断这一点,MMF当然不是设计线程安全的,因为这是共享内存,就像代码中的全局变量一样.如果线程读取和写入共享内存的相同部分,则完全相同的方式出错.并且你必须保护完全相同,锁定以确保只有一个线程可以访问共享部分.

另请注意,您需要在读取和写入MMF的进程之间实现该锁定.这往往是痛苦的,您必须使用"主"进程创建的命名互斥锁,并打开"从属"进程.你不能吝啬锁定要求.值得注意的是,你从来没有提到在你的问题中照顾这一点,所以那里有红旗.

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