猫は怠惰な評価を使用しますか? [コピー]

猫は怠惰な評価を使用しますか? [コピー]

たとえば、パイプを使用する場合

sudo cat /dev/sda | strings | less

SDA デバイスの文字列内で移動できます。しかし、sdaデバイスの内容が完全にロードされ、猫の出力ストリームに出力されますか?それとも、プログラムがcatの出力を要求するたびに改行文字が評価されますか? (つまり、少ないポケットベルでjを押します)

ベストアンサー1

これはHOWや作業lessではなくHOWに関連しています。catstrings

このcatコマンドはデータを標準出力にプッシュし、stringsそれらの間のパイプバッファがいっぱいで誰も読み取らない限りブロックされます。 catそれ自体は最小限のバッファリングを行い、パイプバッファは一般に小さいです。

についても同様ですstrings。結果データが読み取られない場合は、着信データを処理してcatブロックします。lessstrings

lessその入力は、表示されるデータから前後に移動できるようにバッファリングされます。次のページにスクロールすると、そのバッファからlessより多くのデータが読み込まれます。strings今後スクロールしないと、限らlessれた量のデータのみが読み取られると思います(それで、今後スクロールしないとブロックされます)stringscat

大量のデータがパイプで接続されると、バッファlessリングに大量のメモリが使用されます。もしあなたはそれをすべて読むことにしましたless

-Bバッファリングに使用されるメモリ量を64 KB(またはその-bオプションで指定されたサイズ)に制限するオプションがあります。このようにバッファサイズを制限すると、指定されたバッファスペースに格納できるよりもスクロールするのを防ぐことができ、lessメモリ不足なしで大量のデータを読み取ることができます。

また、man lessシステムも参照してください。

おすすめ記事