如何正确使用 MemoryMappedViewAccessor?

How to use MemoryMappedViewAccessor properly?

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

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

我有一些大文件,大小在 1-10 GB 之间。这些由 structs 组成,除文件的第一个字节外,所有 128 个字节。

我需要快速随机访问这些结构中的任何一个,从我读到的内容来看,内存映射文件非常适合。我还需要这些内存映射文件能够被其他进程打开,但是不会有任何写入,只是读取文件。

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

首先,我尝试像这样制作内存映射文件:

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);

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

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

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

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

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

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