大きなワードリストで重複を削除する最も速い方法は?


14

大きなワードリストを重複排除する必要があります。いくつかのコマンドを試して、ここここでいくつかの研究を行いました。そこでは、単語リストを重複排除する最も速い方法はawkを使用しているように見えることを説明しています。

awk-> O(n)?sort-> O(n log n)?

しかし、これは真実ではないようだ。私のテスト結果は次のとおりです。

sort -u input.txt -o output.txt 

実数0m12.446s
ユーザー0m11.347s
sys 0m0.906s

awk '!x[$0]++' input.txt > output.txt

実数0m47.221s
ユーザー0m45.419s
sys 0m1.260s

したがって、sort -uを使用すると3.7倍高速になります。どうしてこれなの?重複排除を行うためのさらに速い方法はありますか?

***********アップデート********

誰かがコメントで指摘したように、私の単語リストはすでにある程度ソートされている可能性があります。この可能性を排除するために、このPythonスクリプトを使用し 2つのワードリストを生成しました。

List1 = 7 Mb
List2 = 690 Mb

結果AWK:
List1を
リアル0m1.643s
ユーザー0m1.565s
sysの0m0.062s

List2
実2m6.918s
ユーザー2m4.499s
sys 0m1.345s

結果SORT:
List1
real 0m0.724s
user 0m0.666s
sys 0m0.048s

List2
real 1m27.254s
user 1m25.013s
sys 0m1.251s


入力データが既にソートされている可能性がありますか?
-iruvar

数字を含むランダムリストを生成し、念のために確認します
karlpy

2
Big O表記は、入力の長さが無限に近づくと何が起こるかに関するものです。これは、アルゴリズムが大きな入力でスケーリングすることを示します。一部のアルゴリズムは、小さな入力サイズでより適切に機能します。
ctrl-alt-delor

1
Karlpy、あなたは何の順序で実行しましたか、最初にawkしますか、それともソートしますか?ファイルキャッシュにより違いが生じる可能性があります
-iruvar

1
@karlpy: "ファイル名を変更しました..."ファイルの名前を変更したという場合、それだけでは十分ではありません。ファイルの名前を変更すると、新しい名前が古いiノードに関連付けられます。古いiノードは、同じ古いデータブロックを引き続き指します。それらがキャッシュされていた場合、それらはまだキャッシュされています。ISTMは、はるかに優れた技術は、(1)になるだろうと、ファイルのコピーを作成し、その後、(2)一つのファイルと(3)の上に一つのコマンドを実行して、他のファイルに他のコマンドを実行します。
スコット

回答:


3

あなたは間違った質問をしている、または間違って間違ったスタックで質問している、これはプログラミング/スタックオーバーフローで尋ねる方が良い質問です。

PS:また、nawk、mawk、gawkで必要な処理を行い、「ゾーンイン」の詳細を示します;)、最小、最大、平均、標準偏差でそれぞれ100回実行します。

CompSci 210からの質問に戻って、それは使用されたアルゴリズムに関するものです。ソートは、サイズとメモリの制約に応じて、いくつかを利用して一時ファイルにファイルをディスクに保存し、メモリが不足するとマージソートされ、ソースコードを調べて何を確認する必要があります特定のsort(1)コマンドは、それを実行している特定のOSで使用しますが、経験からできる限りメモリにロードし、クイックソートを実行し、ディスクに書き込み、繰り返しすすぎます。終了すると、小さなソート済みファイルのマージソートが実行されます。そのため、ここではパーツのO(n * log2(N))を取得し、次にO(n * log(n))のマージ操作を実行します

awk:x [$ 0] ++メカニズムは、ハッシュを使用することを「想定」しています。しかし、ハッシュ(O(1)の「ルックアップ」操作と想定される)に関する問題は、衝突と衝突の処理です。これは、データがうまく拡散していない場合やバケットなどを埋めていない場合に問題を引き起こす可能性があり、大きなリストでは、衝突の処理が正しく行われないとハッシュが大きなメモリの問題になる可能性があります予想されるデータのハッシュアルゴリズムを調整します)、実際のハッシュ関数のパフォーマンスを確認する必要があります。その後、O(1)は挿入(つまり、OのO(log(n))に近くなる可能性があります(1)最初の検索で、存在しない場合はO(log(n))である可能性があるものを追加します。n* O(1)はan * O(log(n))=になります。 > O(n * log(n))、もちろん「解釈された」方法で物事を行っていることは言うまでもありません:)


-2

速度の違いは、「sort」がコマンド(link)であるのに対し、「awk」はプログラミング言語(link)であるためです。

'sort'コマンドは入力を受け取り、出力を返します。「awk」はプログラミング言語であり、最初にコード(端末コマンド)を解釈してから処理を開始します。そのような単純な。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.