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

Cla*_*ung 2 c# io performance

我写了一个程序来清理我几个月来收集的一些财务数据.它总共约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);
                    }
                }
            }
        }       
    }
Run Code Online (Sandbox Code Playgroud)

它非常慢,我估计100GB的数据需要大约3-4天完成它.我知道这是关于我的IO操作,因为我没有缓冲区等来做.我仍然是C#的新手,我找不到任何相关的例子来为IO构建一个合适的缓冲区.我找到的大部分示例都是用于下载,不适用于阅读文本文件.而且我无法将整个文件加载到内存中来处理它,因为它太大了.我该怎么做?任何人都可以给我一些我可以使用的代码片段吗?谢谢

Jon*_*eet 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);
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

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