2012-08-13 72 views
2

我已經編寫了一個程序來清理我在過去幾個月收集的一些財務數據。它總共大約100GB,並且每天都在增長,每個文件大約有1-2GB。它目前以文本文件格式存儲。如何提高讀寫大文本文件的性能?

下面的代碼是用來清理數據:

static void Main() 
    { 
     string inputString; 
     string outputString; 

      // others variable omitted 

     string[] lineSplit; 

     foreach (string fullPath in Directory.GetFiles(inputDirectory)) 
     { 

      using (StreamReader reader = new StreamReader(fullPath))  //read from input file 
      { 
       while ((line = reader.ReadLine()) != null) 
       { 
          //logic to clean data 

           ... 

         /////////////////////////////////////////////////////////// 

        using (StreamWriter writer = File.AppendText(outputFile)) 
        { 
         writer.WriteLine(outputString); 
        } 
       } 
      } 
     }  
    } 

它很慢,我估計數據的100GB它會帶我約3-4天才能完成它。我知道這是關於我的IO操作,因爲我沒有緩衝區等。我對C#還比較陌生,我找不到任何相關示例爲IO構建適當的緩衝區。我發現的大多數例子都是爲了下載,而不適用於閱讀文本文件。我不能將整個文件加載到內存中來處理它,因爲它太大了。我該怎麼做?任何人都可以給我一些我可以使用的代碼片段嗎?感謝

回答

8

你重開每一行輸出文件。通過調用File.AppendText移動迴路其中啓動區塊:

using (TextReader reader = File.OpenText(fullPath)) 
{ 
    using (TextWriter writer = File.AppendText(outputFile)) 
    { 
     while ((line = reader.ReadLine()) != null) 
     { 
      // Logic to clean data 
      writer.WriteLine(outputString); 
     } 
    } 
} 

當然這是假設你有每個輸入文件一個輸出文件。如果是這樣的情況並非如此 - 如果每行可去小集合中的不同的文件 - 你可能希望將所有輸​​出文件打開,只保留一個字典(或類似的東西),因此您可以快速地寫信給任你挑選。

+0

隨機一邊 - 喬恩 - 爲什麼我們(SE)打破你的追蹤?你沒有配額嗎? – 2012-08-13 06:21:53

+0

@MarcGravell:是的。奇怪的是,它*在昨天Meta上對我顯示了10分,但是SO是空白。我將在明天試着研究它。 – 2012-08-13 06:22:54

+0

如果沒有顯然是錯誤的,在你的結束,也讓我們知道你調用一個方法 - 我確信我們能說服蒙蒂來看待它,P特別 – 2012-08-13 06:23:51