25GBのテキストファイルがありますが、数行の文字列を変更するだけです。正常に使用できますが、sed
実行に時間がかかります。
sed -i 's|old text|new text|g' gigantic_file.sql
これを行うより速い方法がありますか?
答え1
あなたは試すことができます:
sed -i '/old text/ s//new text/g' gigantic_file.sql
したがって、引用する:
速度の最適化:実行を高速化する必要がある場合(入力ファイルが大きい場合、またはプロセッサまたはハードディスクが遅い場合)、「s / ... / .find」式が提供される前に「find」式が指定されている場合、置換はより速く行われます。 ../"指示。
10Gファイルの比較です。今後:
$ time sed -i 's/original/ketan/g' wiki10gb
real 5m14.823s
user 1m42.732s
sys 1m51.123s
後ろに:
$ time sed -i '/ketan/ s//original/g' wiki10gb
real 4m33.141s
user 1m20.940s
sys 1m44.451s
答え2
短い答えは「いいえ」です。このタイプのタスクの制限要因はディスクIOです。 25GBのディスクをより速く転送する方法はありません。所定の場所で編集せずに結果をsed
別のドライブ(利用可能な場合)に記録すると、いくつかの改善が得られます。これにより、あるドライブから読み取ることができ、別のドライブに書き込むことができ、競合が少し減ります。少し。
あなた可能すべてのラインに正規表現エンジンを使用しないことで、作業速度を上げることができます。たとえば、Perlを使用している場合(できると確信していますが、構文はわかりませんsed
)、これは10,000行目から始まります。
perl -pe '$. > 10_000 && s/old_text/new_text/g'
RE(メタ文字)にある種の合併症がある場合は、これらの問題を最小限に抑えてください。少し正規表現エンジンの効率を向上させます。
答え3
古いテキストと新しいテキストの長さが同じ場合は、ファイル全体をコピーするのではなく、ファイルを見つけて変更されたバイトのみを書き込むことができます。そうしないと、大量のデータを移動するのが困難になります。
注:これはトリッキーで、カスタムコードを書く必要があります。
システムコールを検索して作成するためにC、C ++、または好みの言語ラッパーを使用している場合は、fseekのマニュアルページを参照してください。
コマンドラインのみを使用しようとしていてテキストのバイトオフセットを取得できる場合は、慎重に作成された "dd"コマンドを使用して代替テキストを所定の位置に書き込むことができます。