〜50kファイルのディレクトリがあります。各ファイルには約 700000 行あります。各行を読み取り、エラーがある場合にのみ出力する awk プログラムを作成しました。すべてが完全に正常に実行されていますが、所要時間は膨大です - ~4 日!!!! この時間を短縮する方法はありますか?複数のコア (プロセス) を使用できますか? 誰もこれを前に試しましたか?
3846 次
1 に答える
2
awk
gawk
自分でこれを修正することはありません。魔法の「並列にする」スイッチはありません。ある程度書き直す必要があります。
- ファイルごとのシャード- これを修正する最も簡単な方法は、ファイルごとに 1 つずつ、複数の awks を並行して実行することです。ある種のディスパッチメカニズムが必要になります。 最大プロセス数で Bash スクリプトを並列化すると、シェルでこれを自分で記述する方法が示されます。もっと読む必要がありますが、より多くの機能が必要な場合は、問題に適応できるギアマンまたはセロリをチェックしてください
- より良いハードウェア- これを高速化するには、おそらくより高速な CPU が必要なようですが、I/O の問題である可能性もあります。munin またはその他の監視システムから CPU と I/O のグラフを取得すると、この場合のボトルネックを特定するのに役立ちます。SSD ベースのシステムでこのジョブを実行してみましたか? 最近では、それはしばしば簡単な勝利です。
- キャッシング- 重複した行またはファイルがある程度存在する可能性があります。十分な重複がある場合は、何らかの方法で処理をキャッシュすると便利です。ファイルの CRC/
md5sum
を計算してデータベースに保存する場合、新しいファイルの md5sum を計算し、既に行っている場合は処理をスキップできます。 - 完全な書き直し- これをスケーリングすると
awk
、ある時点でおかしくなります。map-reduceフレームワークを使用することをお勧めします。
于 2015-08-21T15:53:07.017 に答える