如何提高读写大文本文件的性能?

时间:2012-08-13 06:11:16

标签: c# performance io

我写了一个程序来清理我几个月来收集的一些财务数据。它总共约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构建适当的缓冲区。我找到的大部分示例都是用于下载,不适用于阅读文本文件。并且我无法将整个文件加载到内存中来处理它,因为它太大了。我该怎么做?任何人都可以给我一些我可以使用的代码片段吗?感谢

1 个答案:

答案 0 :(得分: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);
         }
    }
}

当然,假设每个输入文件都有一个输出文件。如果不是这种情况 - 如果每一行都可以转到一个小集合中的另一个文件 - 你可能想要保持所有输出文件打开,只需保留一个字典(或类似的东西),这样你就可以快速写入你想要的任何一个