2012-08-13 69 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