web-dev-qa-db-ja.com

`wc -l`はどのように機能しますか?

大きなファイルを読み取る必要があり、読み取りを開始する前に、ファイルの合計行数(百万単位)を知る必要があります。

私は多くのソリューションを実装し、1つを見つけました。しかし、私の検索中に、私はどのようにwc -l動作します。 Googleで何も見つかりませんでした。

私は自分の問題の解決策を見つけましたが、それでもどのようにwc -l数秒で9200万行のファイルの行数を計算できるので機能します!

どうやって?

11
detraveller

ファイル全体を読み取り、行末の数をカウントします。行末を数えるのは本当に安いです。費やされる時間のほとんどはファイルの読み取りです。ファイルが(ほとんど)バッファキャッシュにある場合、それも安価になります。それ以外の場合は、ファイルストレージの速度によって異なります。

言い換えれば、魔法はありません。

20
rici

WCは、ファイルをrawバイトのブロックで読み取るだけです(ファイルが配置されている基になるファイルシステムの自然なブロックサイズの倍数であることが望ましい)。
次に、バッファをスキャンして行末文字をカウントします。 (-l出力以外の情報が必要な場合に備えて、スペース、タブ、フォームフィード、およびその他の特殊文字もカウントされます。)

ディスクからの読み取りは、速度の点でコストのかかる部分です。バッファのスキャンには、それに比べて無視できるほどの時間がかかります。

1行あたり平均100文字の9千万行があるとします。
これは約9.000.000.000文字または約860MBです。
SATA-3Gb/sドライブを搭載したまともなPCは、10秒以内にそれを実行します。他のアクティビティが同時に進行している比較的遅いファイルシステムでも。
パフォーマンスチューニングと最適化されたファイルシステムを備えた高速マシンは、SATA-6GとSSDドライブに頼らなくても、5秒以内にそれを実行できます。

7
Tonny

フリーソフトウェアの世界へようこそ。あなたはいつでも ソースコード を見ることができます

私はCプログラマーではないことを認めなければなりませんが、私はあなたのためにコードを実際に説明できる人ではありません(そして私would自分自身に興味を持ってください)。

私が知っているのは、wcはファイル自体を開かないが、OSに開くように要求するため、これはOSと、もちろんファイルの保存方法に大きく依存するということです。それとは別に、正しいプログラミング慣行が整っている必要があると思います。ファイル全体を一度に読み取ろうとしないなど。

3
Alois Mahdal