私は、mysqldump の出力を生成時に変更するプログラムに取り組んでいます。現在、mysqldump の出力を固定バイト数のチャンクで読み取るコードがあります。正規表現の一致と、このテキストを読み取ったときに正規表現の置換の両方を実行できる必要があります (最終的なファイル サイズが数ギガバイトであるため、最終的なテキスト出力で正規表現を実行することはできません)。私は PHP でコードを書いていますが、問題 (およびその解決策) は言語に依存しないはずだと思います。
現在、私が持っているものの疑似コードは次のようになります。
$previous_chunk = "";
while (!end_of_file($reader)) {
$chunk = $reader.read() //read in a few thousand characters from the file
$double_chunk = $previous_chunk + $chunk;
// do regular expressions on the double chunk (to catch matches that span the chunk boundary)
$output_file.write($chunk);
$previous_chunk = $chunk;
}
これは 2 つの問題で座礁します。1 つ目は、各チャンクが正規表現によって 2 回評価されるため、チャンク内で一致が発生した場合 (チャンクの境界にまたがっていない場合)、一致するテキストが 1 回しか発生しない場合でも、その一致が 2 回トリガーされます。2 つ目の問題は、これでもまだマッチの置換を行うことができないことです。正規表現はテキストを置き換えますが、出力ファイルに$double_chunk
書き込むだけ$chunk
で、置換の影響を受けません。
私が考えていたことの 1 つは、正規表現が複数の行 (文字で区切られて\n
いる) にまたがる必要があるとは思わないので、プログラムで 2 番目のバッファーを作成し、完了した行でのみ正規表現を実行し、次に書き込むことができるということでした。チャンクごとではなく、行ごとにターゲット ファイルに出力します。残念ながら、mysqldump からの出力の性質上、非常に長い行がいくつかあるため (文字通り数百メガバイトの行もあります)、これは実行可能なオプションではないと思います。
適度なサイズのメモリ フットプリント (数十 MB など) を使用して、このファイルを読み取り、正規表現を使用してストリーム内で変更するにはどうすればよいでしょうか?