2012-03-17 4 views
0

SQLファイルを処理するコマンドgrepのようなプログラムを作成したいと思います。私はそれが働いているときにすべてのコアを使用できることを願っています。 MPIまたはPthreadsだけを使用しても問題ありません。しかし、ファイルを4つのファイルに分割するにはどうすればよいですか?私は700メガバイトのサイズのtxtファイルを持っているなら、どのスレッドをそのファイルの1/4にするのか。grepテストを並列タスクに分割する方法

私の意見では、このファイルの行数を知っていれば、スレッドごとに異なるファイルオフセットを設定する必要があります。それはいい方法ですか、そして、どのように総線数を得るのですか?

多分持っているどのように多くの行のファイルを取得することは、長い時間がかかります:あなたが何をしたいか

[email protected] ~ % time wc -l lineitem.tbl 
6001215 lineitem.tbl 
wc -l lineitem.tbl 0.20s user 0.40s system 4% cpu 12.996 total 
+0

'wc -l'がどれくらいの時間がかかるかをテストするのは難しいです。それは行数を返します(つまり、どれくらいかかりますか?) –

+0

[GNU並列](http://en.wikipedia.org/wiki/GNU_parallel)のようなものをお探しですか? – Pascal

+0

@JonasWielicki時間がかかります。私は自分の質問を編集し、 'wc -l'にかかる時間を追加するだけです。ありがとう〜 – madper

答えて

2

は非常に簡単ではありません。このような問題を処理するために、GoogleのMapReduceやApache Hadoopなどのフレームワークが作成されています。一般的な場合、任意の大きなファイルを任意の並列処理用に分割するのは難しい問題です。このタスクに専用のフレームワークを使用するのが最善です。しかし、あなたの場合、非常に特殊な要件があるようですので、次のようなことをすることができます:

ファイルをN個のチャンク(N =コアの数)に分割します。明らかに、これは行境界を考慮しないので、各チャンク内の次の改行文字を検索する「スプリッタ」ルーチンが必要になります。 (これは正しいと重複しないようにするのは難しいかもしれませんが、基本的にはHadoopやMapReduceの機能と同じです。)次に、各チャンクを並列処理できます。

もちろん、これはあなたが考えるように効果的ではないかもしれません。ファイル全体がメモリに収まらない場合は、I/Oの問題が発生します。 CPU使用率を並列化しているだけであっても、必ずしもI/Oを並列化しているわけではありません。このため、分散処理フレームワークでは通常、複数のハードドライブまたはクラスタノードにまたがってデータが分割されます。

+0

ありがとうございました!私は今試してみる。私は、このファイルをすべてメモリにロードするのを避けるために、異なるファイルオフセットを設定できると思います。 – madper

3

まず、ランタイム統計は、プログラムがI/Oに制限されているように見えます。 膨大な量のスペアCPUがあります。したがって、CPUの部分を並列にすることは、大きなプラスの違いを生み出すことはまずありません。実際、ディスクキャッシュがあまり効果的でない可能性があるため、悪化させる可能性があります。彼は、問題(スキャニングシステムログ)の同様の並べ替えを調査するために多くの人々の協力を得たあなたには、いくつかを見つけるかもしれないので、http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder

でティム・ブレイことで、同様の問題を解決するための実行時間の長いシリーズがありました

準備ができて助けてくれました。

+0

あなたのアドバイスありがとう〜:D – madper

+0

大歓迎です。私はあなたが楽しいソリューションを調査して願っています。 – gbulmer

+0

おそらく、ファイルからデータを読み込むためだけにスレッドを作成できます。次に、データを3つのバッファに入れ、3つのスレッドを作成してデータを処理します。ディスクキャッシュのヒット率が低下するのを避けることができたら – madper

関連する問題