あなたが抱えている主な問題は、常に大きな通常の文字列を使用し、最後にデータを追加していることです。これは毎回文字列を再作成し、多くの時間と特にメモリを消費します。これを使用string.Join
すると、(非常に多数の) 中間文字列値が作成されるのを回避できます。
File.ReadLines
ストリームを直接使用する代わりに を使用して、コードを短縮してテキスト行を取得することもできます。それは本当に良くも悪くもありません。ただきれいです。
var lines = File.ReadLines(path)
.Where(line => !line.Contains("string1") && !line.Contains("string2"));
File.WriteAllText(path, string.Join(Environment.NewLine, lines));
別のオプションは、出力の書き込みもストリーミングすることです。IEnumerable<string>
入力を積極的に評価せずにa を書き出すための適切なライブラリ メソッドがないため、独自のメソッドを作成する必要があります (これは十分に単純です)。
public static void WriteLines(string path, IEnumerable<string> lines)
{
using (var stream = File.CreateText(path))
{
foreach (var line in lines)
stream.WriteLine(line);
}
}
また、出力をストリーミングする場合、同じファイルを同時に読み書きしたくないため、一時ファイルが必要になることにも注意してください。
//same code as before
var lines = File.ReadLines(path)
.Where(line => !line.Contains("string1") && !line.Contains("string2"));
//get a temp file path that won't conflict with any other files
string tempPath = Path.GetTempFileName();
//use the method from above to write the lines to the temp file
WriteLines(tempPath, lines);
//rename the temp file to the real file we want to replace,
//both deleting the temp file and the old file at the same time
File.Move(tempPath, path);
最初のオプションとは対照的に、このオプションの主な利点は、メモリの消費量がはるかに少ないことです。実際、ファイル全体ではなく、一度にファイルの行をメモリに保持する必要があるだけです。ただし、ディスク上で(一時的に)少し余分なスペースを占有します。