2

我有一个大文本文件(0.5 gig),我需要在不同的情况下一遍又一遍地解析它,在一个方法中多达 40 次。当然,这将需要很长时间,我试图通过同时执行来更快地处理文件。我知道 aMemoryMappedFile非常适合处理大文件和并发,所以我选择使用它。

现在,我同时创建了文件的两个视图(这些视图属于两个不同的部分),但是一个视图效果很好,另一个则抛出了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");

你知道什么会导致这种情况吗?

4

1 回答 1

2

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

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

于 2012-07-05T17:55:23.657 回答