Last Updated 2011/09/21
並列コンピューティングをサポートする .NET Framework の機能は、System.Threading.Tasks 名前空間内の Parallel クラスなどで実装されています。PLINQ でも内部的にはこの名前空間内にある各クラスを使っているものと想像します。しかし、PLINQ ではこれらのクラスを意識する必要はありません。
以下のコードを見てください。
private void button1_Click(object sender, EventArgs e) { var list = new List<int> { 78, 92, 100, 37, 81 }; // Enumerable<T> クラスの Average メソッドを使う double average1 = list.Average(); // ParallelEnumerable<T> クラスの AsParallel メソッドを使う double average2 = list.AsParallel().Average(); textBox.Text = String.Format("{0} {1}", average1, average2); }
average1 は通常の処理をまた、average2 のほうは並列処理を指定しています。ポイントは AsParallel メソッドです。このメソッドは ParallelQuery<T> オブジェクトを返しますが、これは ParallelEnumerable<T> オブジェクトの拡張メソッドの利用を可能とします。つまり、PLINQ の機能は ParallelEnumerable<T> オブジェクトに実装されています。
このように、PLINQ の内部的な処理はブラックボックスになっていますが、使い方自体は簡単です。ただし、処理を並列化する手続きはオーバーヘッド(事前の処理とか、不都合のチェック)が大きいので、データ量が多いなど、並列化のメリットが得られる場合に限定して使うべきです。
LINQ と PLINQ との違いをあげるべきかもしれませんが、使い方は基本的に同じと考えていいと思います。ParallelEnumerable<T> クラスの詳細については、Software のページで公開している NETClass を参照してください。
前の項で、LINQ と基本的な使い方は同じと書きましたが、それでは愛想がないので、一つ使用例をあげておきます。私のパソコンの CPU は Intel Core i5 760 2.80 GHz で、いわゆるダブルコアです。したがって、並列処理の効果が得られる環境にあります。そこで、実際にダブルコアの効果があるかどうかをチェックしてみました。
直接 CPU の動作状況を知ることはできませんが、Windows に付属のガジェットの一つの CPU メーターをチェックしてみました。かなり大きなアプリケーションを複数起動しても CPU メーターの使用量は 35 % 前後です。しかし、今回紹介するアプリケーションを使うと、最高で 85 % ぐらいまで上がりました。50 % を超えると、2 つのコアが動作したと判断していいのかどうかは分かりませんが、これ以外の状態で 85 % まで上がったことはありませんから、並列処理の効果があったと考えていいのではないかと思います。
実際に並列処理するかどうかは .NET Framework の気分次第です。並列処理の必要はないと判断すると、並列処理しません。もちろん、強制的に並列処理させることはできますが、意味はないでしょうね。
さて、作成するアプリケーションは、複数のテキストファイル(拡張子で指定可能)の中から指定の文字列を検索するものです。アプリケーションの性格上、かなり多くのファイルを対象としないと効果のほどは分かりません。下図は、アプリケーションを起動したところです。
[検索文字列] は検索する文字列です。正規表現が可能です。
[検索ディレクトリ] は検索対象のディレクトリです。右の [...] ボタンをクリックすると、フォルダ選択ダイアログボックスが開きますので、ディレクトリを選択してください。複数のディレクトリを対象とできます。ディレクトリを選択すると、下のリストボックスにリストアップします。
[拡張子] は、検索対象とするファイルを絞り込むために使います。「例」で示したとおり、テキストファイルの拡張子を指定してください。
準備がよければ、[検索開始] してください。結果は下のリストビューに表示します。「ファイル」はファイルのフルパス、「テキスト」は検索に成功した行のテキストです。
以下の ZIP ファイルは上図のアプリケーションのソースファイルを含みます。このプロジェクトは .NET Framework 4.0 が必須です。なお、フリーウエアですので、自由にご利用ください。
PLINQTest.zip (46,268 bytes)
−以上−