"wc -l" を使用すると、ファイルの処理に時間がかかります。より速い選択肢はありますか?

"wc -l" を使用すると、ファイルの処理に時間がかかります。より速い選択肢はありますか?

複数の大きなファイルのそれぞれの行数を出力するスクリプトを作成するのに役立ちます。時間がかかるため、一致するすべてのファイルの最後の行番号を表示するコマンドをwc -l使用したいと思います。awkabd*2020-09-21*

  • ls -l abd*2020-09-21*22個の長い(大)ファイルを表示中
  • wc -l各ファイルの結果を見つける必要があります。
  • 現在私が使用している
    wc -l abd*2020-09-21.txt > CCNC_UNIX_COUNTS.txt
    
    しかし、これは非常に時間がかかります。改善に役立つ必要があります。

頑張った

sed -n '$='

matchinvはすべてのファイルに対してループで動作abd*2020-09-21.txtし、結果をファイルに出力する必要があります。CCNC_UNIX_COUNTS

答え1

テキストファイルは、インデックスやメタデータを持たないバイトストリームであり、各行の後に改行文字が続く行です。ファイル全体を読む以外に、行数を数える他の方法はありません。wc -lこれは、改行バイトを読み取るバッチスキャン以外に他の操作を実行する必要がないため、効率的に実行できます。一方、awk見てみる他のツールもたくさんあります。コンテンツフィールド分割の実行と同じ行では、実行のために提供したコードを解釈して実行する必要があります。wc -lこれより速いスクリプト言語はありません。

一方、メタデータの欠落が通常問題である場合は、他のファイル形式(SQLiteデータベースなど)を使用することがオプションかもしれません。もちろん、これにより、一般的なテキスト処理ツールを使用してデータを操作することはできませんが、ランダムアクセスが容易になります。または、すべての行を保持するようにデータパスを変更できる場合一定の長さ、ランダムアクセスと行の計算は簡単です(ただし、途中で行を挿入または削除しません)。

答え2

数が正確である必要がない場合は、ファイルの末尾からサンプリングして平均を取得し、非常に高速な統計で得られたファイルのバイト長に基づいて行数を計算して長さを推定できます。 。

たとえば、/ tmpに100MBのファイルがあります。使用:

time wc -l /tmp/100-mb.txt

生産する:

1777700 /tmp/100-mb.txt
real    0m0.075s

推定には Perl コードを使用します。

time ./esmele /tmp/100-mb.txt

生産する:

1763385
real    0m0.012s

精度は99%以上で、速度は6倍向上します。 Perl 変換が省略されるため、C または類似のコードがより高速になる可能性があります。

システムで実行:

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
perl 5.20.2

頑張って...乾杯、drl

答え3

ハードウェアによっては、次のことを試すことができます。

expr-fi/fastlwc: SIMD強化ワードカウンター - GitHub

マルチスレッドバージョンもあります。

大容量ファイルでテストしたことはありませんが、うまくいきますはい早く。

SIMDによる単語計算アルゴリズムはreadmeファイルに記載されています。基本的なアイデアは次のとおりです。

Just a sample (multiple   spaces).
1111010111111011111111100011111111             =[1]
0111101011111101111111110001111111 SHIFT [1]   =[2]
1000010100000010000000001110000000 NOT [2]     =[3]
1000010100000010000000000010000000 [1] AND [3]

fastwc単語と行は計算されますが、マルチバイト文字は計算されません。

関連情報