MemoryMappedViewStream错误“没有适当的访问权限”

时间:2017-09-06 20:02:23

标签: c# memory-mapped-files

我正在尝试创建一个MMF支持的集合,动态扩展到2GB。我希望能够在添加新项目的同时阅读现有项目。它在我的开发机器上工作得很好,但我在某些机器上出错:

  

线程试图读取或写入没有相应访问权限的虚拟地址。

之前有没有人见过这个错误?我可能在处理MemoryMappedFiles的方式上做错了,我正在创建一个带有DelayAllocatePages标志的2GB MMF,所以它不会马上使用它:

public const long ONE_GIGABYTE = 1073741824;
long maxCapacity = 2 * ONE_GIGABYTE;
mmStorage = MemoryMappedFile.CreateNew(mmfName, maxCapacity, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages, null, HandleInheritability.Inheritable);

然后我一次向它写一个数据块,使用内部集合来跟踪每个块的位置。

lock ( writeLock ) {
    // get the most recently added item
    var lastItem = _itemLocations[_itemLocations.Count - 1];
    // calculate next items offset
    long newOffset = lastItem.Offset + lastItem.Length;

    // add next items data
    using ( var mmStream = mmStorage.CreateViewStream(newOffset, itemBytes.Length, MemoryMappedFileAccess.ReadWrite) ) {
        Trace.WriteLine(string.Format("Writing {0} bytes at location {1}", itemBytes.Length, newOffset));
        mmStream.Write(itemBytes, 0, itemBytes.Length);
    }

    // add location info to list
    _itemLocations.Add(new ItemLocation()
    {
        Offset = newOffset,
        Length = itemBytes.Length
    });
}

在远程计算机上,第一次写入正常,但第二次写入导致我提到的异常完全杀死程序。

  

在位置0写入5973个字节

     

在5973位置写入5901个字节

     

线程试图读取或写入没有相应访问权限的虚拟地址。

更新

我尝试过更改

MemoryMappedFileOptions.DelayAllocatePages

MemoryMappedFileOptions.None

它会停止抛出异常,但它也会立即分配完整的2GB。我更愿意,如果我可以根据需要增长MMF,但我想它不适用于所有机器。我不确定为什么DelayAllocatePages适用于某些机器,而不适用于其他机器。

0 个答案:

没有答案