我正在尝试创建一个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
适用于某些机器,而不适用于其他机器。