バイトベースの検索と置換を実行したい 4Gb ファイルがあります。それを行うための簡単なプログラムを作成しましたが、検索と置換を 1 回行うだけでは時間がかかりすぎます (90 分以上)。私が試したいくつかの 16 進エディタは、3 分以内にタスクを実行でき、ターゲット ファイル全体をメモリにロードしません。同じことを達成できる方法を知っている人はいますか? これが私の現在のコードです:
public int ReplaceBytes(string File, byte[] Find, byte[] Replace)
{
var Stream = new FileStream(File, FileMode.Open, FileAccess.ReadWrite);
int FindPoint = 0;
int Results = 0;
for (long i = 0; i < Stream.Length; i++)
{
if (Find[FindPoint] == Stream.ReadByte())
{
FindPoint++;
if (FindPoint > Find.Length - 1)
{
Results++;
FindPoint = 0;
Stream.Seek(-Find.Length, SeekOrigin.Current);
Stream.Write(Replace, 0, Replace.Length);
}
}
else
{
FindPoint = 0;
}
}
Stream.Close();
return Results;
}
ちなみに、4Gbの「ファイル」と比較すると、検索と置換は比較的小さいです。アルゴリズムが遅い理由は簡単にわかりますが、どうしたらもっとうまくできるかわかりません。