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 构建适当的缓冲区。我发现的大多数示例都是用于下载的,不适用于阅读文本文件。而且我无法将整个文件加载到内存中进行处理,因为它太大了。我该怎么做?谁能给我一些我可以使用的代码片段?谢谢

4

1 回答 1

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);
         }
    }
}

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

于 2012-08-13T06:13:03.303 回答