如何正确使用MemoryMappedViewAccessor?

时间:2017-04-04 15:16:03

标签: c# struct memory-mapped-files memory-mapping

编辑:如果您要进行投票,请解释原因。对任何人都没有帮助。

我真的想了解如何正确使用内存映射文件,但我遇到了一些问题。这是场景:

我有一些大文件,大小不超过1-10 GB。它们由structs组成,所有128个字节除了文件的第一个字节外。

我需要快速随机访问这些结构中的任何一个,这是我读到的内存映射文件的最佳选择。我还需要这些内存映射文件才能被其他进程打开,但是不会有任何写入,只需要读取文件。

我能够确定需要读取的确切结构的字节偏移量。

首先,我尝试制作mem-mapped文件,如下所示:

MemoryMappedFile hFileMapping = MemoryMappedFile.CreateFromFile(rampPath, FMode, Path.GetFileNameWithoutExtension(rampPath), GetFileLength(rampPath), access);

但是,其他进程无法打开它。所以我发现有另一个构造函数接受FileStream。所以我改成了这个:

FileStream fs = new FileStream(rampPath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
MemoryMappedFile hFileMapping = MemoryMappedFile.CreateFromFile(fs, Path.GetFileNameWithoutExtension(rampPath), GetFileLength(rampPath), access, null, HandleInheritability.Inheritable, true);

其他进程现在可以打开mem-mapped文件。然后我尝试查看映射文件:

MemoryMappedViewAccessor hFileAccessor = hFileMapping.CreateViewAccessor(0, GetFileLength(rampPath), MemoryMappedFileAccess.Read));

如果文件很小,这很好,但如果它们很大,我会得到out of storage和内存异常。

所以我需要一次只映射文件的一部分,但是确定我正在寻找的结构是否在当前映射视图中的最佳方法是什么?我是否跟踪当前映射视图的偏移量和长度,并查看结构的偏移量是否在那里?是否有更好的方法来解决这一切?

1 个答案:

答案 0 :(得分:0)

感谢@Ross Bush在OP的评论中提出的建议。

我所做的只是让ViewAccessor的容量始终为设定量。由于我有我需要的字节偏移量,我只是运行了一些计算来确定字节偏移是否在ViewAccessor内。如果不是,则将ViewAccessor更改为不同的偏移量/容量,以便字节偏移量落在其中。