2012-07-05 3 views
2

하나의 메서드에서 40 번 이상 다른 상황에서 반복해서 구문 분석해야하는 큰 텍스트 파일 (0.5 기가)이 있습니다. 물론 이것은 오랜 시간이 걸릴 것이고 나는 그것을 동시에 수행함으로써 파일을 더 빨리 처리하려고 노력했다. MemoryMappedFile은 대용량 파일 및 동시 처리를 처리하는 데 적합하므로 사용하기로 결정했습니다.MemoryMappedFile의 동시 뷰에서 UnauthorizedAccessException을 throw합니다.

이제 파일의 두보기가 동시에 생성되지만 (보기는 두 부분으로 나뉩니다) 한보기가 훌륭하게 작동하는 동안 다른보기는 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

이 예외는 의미가 없습니다. 악성 코드 스캐너와 같은 환경에 의해 트리거된다는 가정하에 작업하십시오. 32 비트 프로세스에서 두 개의 * 0.5GB보기를 할당 할 수있는 방법이 없기 때문에 더 적은 것을 요구함으로써 시작하십시오. –

+0

환경에 의해 예외가 트리거 되었습니까? 나는 그것이 가능하다는 것을 몰랐다. 또한 총 4 개의 뷰가 동시에 * 총 * 0.5GB로 실행됩니다. 각 파일은 0.5GB 파일의 1/4입니다. 개인 메모리 맵 파일 파일 = MemoryMappedFile.CreateFromFile ( 새로운하여 FileStream (경로, FileMode.Open, FileAccess.Read, FileShare.Read), "MemoryMappedPi" – Michael

답변

2

아마도 메모리 매핑 된 파일을 만드는 방법과 관련이 있습니다. 이 post에 대한 John Skeet의 대답을 확인하십시오. MemoryMappedFileAccess.Read 액세스는 CreateFromFile 메서드에 전달됩니다.

편집 : 주석에 표시된대로 CreateViewAccessor 메서드는 뷰에서 액세스 할 파일의 부분을 결정하는 매개 변수로 오프셋과 크기를 사용합니다. 이러한 값이 파일의 실제 크기를 벗어나면 UnauthorizedAccessException이 발생합니다.

+0

는 나는 다음과 같은 코드로 MemoryMappedFileAccess''을 허용 생성자를 사용하여 시도 , 500000000, MemoryMappedFileAccess.Read, null, HandleInheritability.Inheritable, false); 어떤 도움을받지 못했습니다. 이것은 또한 왜 이것이 하나의 스레드에서 작동하지만 다른 스레드에서는 작동하지 않는지 설명하지 않습니다. – Michael

+2

2 개의 다른 스레드에서 동일한 MemoryMappedFile에서 2 개의 MemoryMapViewAccessor를 만들려고했지만 예외가 없습니다. 두 스레드의 PartitionAndAnalyzeTextBlock 메소드에서 동일한 값을 테스트와 마찬가지로 전달하려고 시도 했습니까? CreateViewAccessor에있는 파일 크기에 맞지 않는 매개 변수 값을 전달하면 UnauthorizedAccessException이 발생합니다. – Absolom

+0

나는 그것을 생각하지 않았다는 것에 놀랍니다. 그 문제는 파일 외부에 매개 변수를 전달하는 것입니다 ... 그냥 주석 대신 대답을 넣으면 받아 들여서 기쁩니다. – Michael

관련 문제