2017-08-02 224 views
1

我有巨大的文本文件(1GB +)。所以我想,如果像下面這樣將有可能:類似於Parallel.ForEach File.Readling - 而不是readline,從指定索引讀取?

  • ReadFile和創建開始索引/位置
  • 使用Parallel.ForEach int數組讀取該文件與所有的指標開始,直到你到達時下一個索引或特定字符

TEXTFILE:

"I am a test file. Please use me. You used me. Urraaaaaaaaaay!" 

int array = {0,10,20}; 

Parallel.ForEach用3個線程:

  1. ReadFile的起始字符,在0到9
  2. ReadFile的在10與字符開始至19
  3. ReadFile的在20與字符開始到結束

1 GB只是一個文件。我們每隔10秒24/7就會收到一個這樣的文件。

+6

除非你正在做一些CPU密集型的數據這個環節,我沒有看到多少點。讀取文件的瓶頸不是CPU,而是硬盤。 – Rotem

+2

我也建議看看這個:http://cc.davelozinski。com/c-sharp /最快的方式閱讀文本文件 –

+0

我同意@Rotem,說,創新是真棒,試試看,並讓我們知道它是如何工作的。 – Trey

回答

1

並行for循環將加速從大型文本文件讀取。鑑於您每24小時每隔10秒獲得一個1GB文件,因此實施Parallel.For循環是值得的。

大衛LOZINSKI上閱讀文本文件跑many tests(1),然後比較parallelism to regular for loops(所有的例子都採取或從大衛LOZINSKI調整。)

對於行長度等於5個GUID(160個字符)的文本文件,使用ReadAllLines將文本添加到數組的速度更快。

例如:

AllLines = new string[MAX]; //only allocate memory here 
AllLines = File.ReadAllLines(fileName); 

對於具有更長的線的文本文件(> 10組的GUID或320個字符)這是略微更快地使用ReadLine和具有或不具有BufferedStream創建陣列。

AllLines = new string[MAX]; //only allocate memory here 
using (StreamReader sr = File.OpenText(fileName)) 
{ 
    int x = 0; 
    while (!sr.EndOfStream) 
    { 
      AllLines[x] = sr.ReadLine(); 
      x += 1; 
    } 
} // The using will dispose of any resources. 

然後在並行For循環內處理該數組。

Parallel.For(0, AllLines.Length, x => 
{ 
    YourFile Processing(AllLines[x]); 
}); 

這應該可以處理顯著更快的時間,雖然這也將取決於運行該程序的機器上,它的CPU和多少個線程可用來傳播的並行處理。

(1)感謝jason.kaisersmiththe comments

相關問題