我真的很想了解如何正确使用内存映射文件,但我遇到了一些问题。这是场景:
我有一些大文件,大小从 1 GB 到 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
和内存异常。
所以我一次只需要映射文件的一部分,但是确定我正在查找的结构是否位于当前映射视图中的最佳方法是什么?我是否跟踪当前映射视图的偏移量和长度并查看结构的偏移量是否在其中?有没有更好的方法来解决这一切?
感谢OP评论中的@Ross Bush提出的建议。
我所做的只是使
ViewAccessor
的容量始终为设定值。由于我有所需的字节偏移量,因此我只需运行一些计算来确定字节偏移量是否在 ViewAccessor
内。如果不是,则将 ViewAccessor
更改为不同的偏移量/容量,以便字节偏移量落入其中。