sedはなぜそんなに速いのですか?

sedはなぜそんなに速いのですか?

この質問がSEに適しているかどうかを考えてみました。同意してください。

しばらく前にSEでファイル内のテキストを検索し、検索中のテキストを含む一致する行だけを保持する方法を尋ねました。問題はここにあります: OS Xで端末を使用してファイル内のテキストを検索し、一致する行のみを維持するにはどうすればよいですか?

sed答えは完璧だったが、なぜそれほど速いのか疑問に思います。私のユースケースでは、合計サイズが約30 GBのファイルがかなりあります。コマンドはsed約12秒間実行されました。これは私の心を驚かせました(通常のHDDを使用)。 12秒で、このコマンドは各ファイルを切り取り、30 GBのテキストを読み取り、フィルタリングされた対応する行だけを保持します。どのように動作しますか?(または:これはどのような魔法ですか?)

実際のコマンドは次のとおりです。

find . -type f -exec sed -i'' '/\B\/foobar\b/!d' {} \;

ベストアンサー1

考えられる答えは次のとおりです。

  1. 断片化のない、または断片化の少ない30Gbファイル:すべてのハードドライブは、大容量ファイルチャンクをキャッシュする機能により、シーケンシャルアクセス(SSDを含む)でより良いパフォーマンスを発揮します。これにより、最高のパフォーマンスを達成できます。順次アクセスはあらゆるレベルのキャッシュに役立ちます。
  2. sedストリームエディタは一度に1行ずつ処理します。これはメモリスペースが小さいことを意味します。emacsWindowsやMacなどのテキストエディタとは異なり、vimメモリにファイルの完全なコピーを保持する必要はありません。
  3. -i@Rameshが提案したように(を使用して)ファイルをその場で編集しています。ウィキペディアページ)は一時ファイルを作成し、古いファイルになります。

これが意味するのsedは、ほとんど最小限のファイル操作を実行できることです。つまり、元のファイルの各行を一度読み込み、一致する行だけを記録します。

正規表現の選択はパフォーマンスに影響を与え、時には非常に悪い方法で影響を与えます。コーディングホラーブログ

おすすめ記事