2

大きなテキスト ファイル (0.5 ギガ) があり、さまざまな状況で何度も解析する必要があり、1 つのメソッドで 40 回も解析する必要があります。もちろん、これには長い時間がかかるので、ファイルを同時に処理することで、ファイルをより速く処理しようとしました。MemoryMappedFileaは大きなファイルと同時実行性を処理するのに優れていることを理解しているので、それを使用することにしました。

現在、ファイルの 2 つのビューを同時に作成しています (ビューは 2 つの異なる部分です) が、一方のビューはうまく機能しますが、もう一方は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 に答える