約2000個の.txtファイルがあります。各ファイルの行数は500,000個以下でなければなりません。 40GB程度になります。
すべてのファイルは単語を含み、各単語は新しい行を占めます。一部のファイルには、他のファイルに含まれているものと同じ単語(重複とも呼ばれる)を含めることができます。したがって、すべての重複エントリを削除し、各単語を一度だけ維持する必要があります。
すべての行を1つのファイルに書き、awkモードを試してみました。このように:
awk '!seen[$0]++' Documents/* > result.txt
それは無駄です。 「メモリを割り当てられません」というエラーが発生しました。
すべてを1つのファイルに書き込む必要はありません。そして、一意の行だけでなく、5文字以上101文字未満の行も選択できれば良いようです。 8つのVCPUと30 GBのRAMを持つシステムでこれを実行しようとしています。
どんな提案がありますか?
答え1
シンプル
sort -u Documents/*.txt > result.txt
それは行わなければなりません。sort
メモリよりも大きなファイルを処理する方法が既にわかっているため、awkで表示されるメモリ不足エラーは発生しないでください。 awkにメモリが足りないという事実が少し驚いたことを認めなければなりません。 32ビットアプリケーションにコンパイルされましたか?
通常、sort
この方法を使用するよりも使用する方が遅くなる可能性がありますawk '!seen[$1]++'
。ファイルをグループ化して速度を回復できます。