我有一个大文本文件(0.5 gig),我需要在不同情况下反复解析,在单个方法中多达40次。当然这需要很长时间,我试图通过同时执行来更快地处理文件。我知道MemoryMappedFile
非常适合处理大文件和并发,所以我选择使用它。
现在,我同时创建了两个文件视图(视图有两个不同的部分),但是一个视图效果很好,另一个视图抛出UnauthorizedAccessException
。这是有罪的代码:
private void PartitionAndAnalyzeTextBlock(int start, int length)
{
Console.WriteLine("Starting analysis");
//Exception thrown here
using (var accessor = file.CreateViewAccessor(start, length, MemoryMappedFileAccess.Read))
{
char[] buffer = new char[BufferSize];
for (long i = 0; i < length; i += 5)
{
accessor.ReadArray(i, buffer, 0, 5);
string retString = new string(buffer);
frequencyCounter.AddOrUpdate(retString, 1, (s, j) => j++);
}
}
Console.WriteLine("Finished analysis");
}
file
在此行中实例化:
private MemoryMappedFile file = MemoryMappedFile.CreateFromFile(path, FileMode.Open, "MemoryMappedPi");
你知道是什么原因引起的吗?
答案 0 :(得分:2)
这可能与您如何创建内存映射文件有关。检查John Skeet对此post的回答。 MemoryMappedFileAccess.Read访问被传递给CreateFromFile方法。
编辑:如注释所示,CreateViewAccessor方法将偏移量和大小作为参数来确定视图将访问的文件的哪个部分。如果这些值超出文件的实际大小,则将抛出UnauthorizedAccessException。