数行で文字列を置き換える必要がある25GBのテキストファイルがあります。私は問題なく使用できますsed
が、実行には本当に長い時間がかかります。
sed -i 's|old text|new text|g' gigantic_file.sql
これを行う簡単な方法はありますか?
数行で文字列を置き換える必要がある25GBのテキストファイルがあります。私は問題なく使用できますsed
が、実行には本当に長い時間がかかります。
sed -i 's|old text|new text|g' gigantic_file.sql
これを行う簡単な方法はありますか?
回答:
あなたが試すことができます:
sed -i '/old text/ s//new text/g' gigantic_file.sql
この参照から:
速度の最適化:実行速度を大きくする必要がある場合(大きな入力ファイルまたは遅いプロセッサまたはハードディスクのため)、「s /.../」を指定する前に「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
sed
つづりが間違っています。私は最後の修正するために、昨日、この記事を編集しsed
なければなりませんコマンドtime sed -i '/original/ s//ketan/g' wiki10gb
とされていませんtime sed -i '/ketan/ s//original/g' wiki10gb
。今日は編集を元に戻しています。1。時間がコマンドと一致しなくなったため。2. 3GB以上のファイルでGNU sedを使用して同じテストを行ったため、2つのsed
選択肢に違いは見られません。時間の違いはスペルミスによるものだと思います。
time
個人的に結果に多くの変動を見ましたが、全体として、時間の差はありませんでした。
短い答えは「いいえ」です。この種の操作の制限要因はディスクIOです。25GBのディスクをより速くストリーミングする方法はありません。編集をsed
インプレースせずに、結果を別のドライブに書き込むと(使用可能なドライブがある場合)、少し改善される可能性があります。結果として競合が少なくなります。
あなたは可能性がある(私はかなり確信してあなたがこれを行うことができますよので、Perlを使用して、たとえば-行ごとに正規表現エンジンを使用していないことで少しそれをスピードアップすることができるsed
が、私は、構文を知らない) -これはから始まります10,000行目以降。
perl -pe '$. > 10_000 && s/old_text/new_text/g'
また、RE(メタキャラクター)に何らかの複雑な問題がある場合、それらを最小化すると、正規表現エンジンの効率がわずかに向上します。
sed -i '10000,$ s/old_text/new_text/g'
sed
比較するのかわかりません-私はわずかに速いと仮定しますが、ファイルサイズのためにそれほどではありません。
sed
でperl
、後者はまた、あなたがあまりにもスクリプトVERBOSE以上書くことができます。
新しいテキストと古いテキストの長さが同じ場合、ファイル全体をコピーする代わりに、ファイルを検索して変更されたバイトのみを書き込むことができます。そうしないと、大量のデータを移動することに縛られてしまいます。
注:これには注意が必要であり、カスタムコードの記述が必要です。
CまたはC ++で作業している場合は、fseekのマニュアルページを参照するか、システムコールのシークおよび書き込み用の言語ラッパーを参照してください。
コマンドラインのみの使用を主張し、テキストのバイトオフセットを取得できる場合は、慎重に記述された「dd」コマンドを使用して、置換テキストを所定の場所に書き込むことができます。