MemoryMappedFile的并发视图会抛出UnauthorizedAccessException

时间:2012-07-05 17:13:13

标签: c# .net c#-4.0

我有一个大文本文件(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");

你知道是什么原因引起的吗?

1 个答案:

答案 0 :(得分:2)

这可能与您如何创建内存映射文件有关。检查John Skeet对此post的回答。 MemoryMappedFileAccess.Read访问被传递给CreateFromFile方法。

编辑:如注释所示,CreateViewAccessor方法将偏移量和大小作为参数来确定视图将访问的文件的哪个部分。如果这些值超出文件的实际大小,则将抛出UnauthorizedAccessException。