2012-07-05 27 views
2

我有一個大的文本文件(0.5演出),我需要在不同的情況下反覆解析,在單個方法中多達40次。當然這需要很長時間,我試圖通過同時處理文件來更快地處理文件。據我所知,MemoryMappedFile對於處理大文件和併發是非常好的,所以我選擇使用它。MemoryMappedFile的併發視圖拋出UnauthorizedAccessException

現在,我正在同時創建文件的兩個視圖(視圖是兩個不同的部分),但一個視圖很好,另一個視圖會拋出一個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位進程中分配* 2 * 0.5 GB的視圖,因此首先要少得多。 – 2012-07-05 18:25:17

+0

由環境引發的異常?我不知道這是可能的。此外,還有四個視圖同時運行,總共* 0.5 GB。每個是0.5GB文件的四分之一。 – Michael 2012-07-05 18:35:02

回答

2

這可能與您如何創建內存映射文件有關。查看John Skeet在這個post上的答案。 MemoryMappedFileAccess.Read訪問被傳遞給CreateFromFile方法。

編輯:如註釋所示,CreateViewAccessor方法將偏移量和大小作爲參數來確定視圖將訪問的文件的哪個部分。如果這些值超出文件的實際大小,則會拋出UnauthorizedAccessException。

+0

我嘗試使用,允許'MemoryMappedFileAccess'用下面的代碼構造函數: 私人MemoryMappedFile文件= MemoryMappedFile.CreateFromFile( 新的FileStream(路徑,FileMode.Open,FileAccess.Read,FileShare.Read), 「MemoryMappedPi」 , 500000000, MemoryMappedFileAccess.Read, null, HandleInheritability.Inheritable, false); 這沒有幫助。這也不能解釋爲什麼這可以在一個線程上運行,但不能在另一個線程上運行 – Michael 2012-07-05 18:06:35

+2

我曾嘗試在2個不同的線程中從同一個MemoryMappedFile創建2個MemoryMapViewAccessor,並且我沒有得到任何異常。您是否嘗試過在您的兩個線程中的PartitionAndAnalyzeTextBlock方法中傳遞相同的值,就像測試一樣。如果您傳遞的參數值不符合CreateViewAccessor中文件的大小,則會出現UnauthorizedAccessException。 – Absolom 2012-07-05 19:53:09

+0

我很驚訝,我沒有想到這一點。這就是問題所在,在文件外部傳遞參數......只需將它放在答案中而不是評論中,我會很樂意接受它。 – Michael 2012-07-06 07:40:35

相關問題