2

数か月にわたって収集した財務データを消去するプログラムを作成しました。合計で約 100 GB で、毎日増加しています。各ファイルはそれぞれ約 1 ~ 2 GB です。現在、テキスト ファイル形式で保存されています。

以下のコードは、データを消去するために使用されます。

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

非常に遅いです。100 GB のデータの場合、完了するまでに約 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);
         }
    }
}

もちろん、これは入力ファイルごとに 1 つの出力ファイルがあることを前提としています。そうでない場合 - 各行が小さなコレクション内の別のファイルに移動できる場合 - すべての出力ファイルを開いたままにし、辞書 (または同様のもの) を保持して、必要なファイルにすばやく書き込むことができるようにすることをお勧めします。 .

于 2012-08-13T06:13:03.303 に答える