web-dev-qa-db-ja.com

Javaでの並列プログラミング

Javaで並列プログラミングを行うにはどうすればよいですか?そのための特別なフレームワークはありますか?どうやってものを機能させることができますか?

私はあなたに必要なものを教えます、私はウェブクローラーを開発し、それがインターネットから多くのデータをクロールすると思います。 1つのクロールシステムでは物事が適切に機能しないため、より多くのシステムを並行して動作させる必要があります。この場合、並列計算を適用できますか?例を挙げていただけますか?

36
Alex Mathew

純粋な並列プログラミング、つまり並行プログラミングではない場合、 MPJExpress http://mpj-express.org/ を必ず試してください。これは、mpiJavaのスレッドセーフな実装であり、分散メモリモデルと共有メモリモデルの両方をサポートしています。私はそれを試してみましたが、非常に信頼できることがわかりました。

1 import mpi.*;  
2  
3 
/**  
4  * Compile:impl specific.  
5  * Execute:impl specific.  
6  */  
7  
8 public class Send {  
9 
10     public static void main(String[] args) throws Exception { 
11 
12         MPI.Init(args); 
13 
14         int rank = MPI.COMM_WORLD.Rank() ; //The current process.
15         int size = MPI.COMM_WORLD.Size() ; //Total number of processes
16         int peer ; 
17 
18         int buffer [] = new int[10]; 
19         int len = 1 ;
20         int dataToBeSent = 99 ; 
21         int tag = 100 ; 
22 
23         if(rank == 0) { 
24 
25             buffer[0] = dataToBeSent ; 
26             peer = 1 ; 
27             MPI.COMM_WORLD.Send(buffer, 0, len, MPI.INT, peer, tag) ; 
28             System.out.println("process <"+rank+"> sent a msg to "+ 29                                "process <"+peer+">") ; 
30 
31         } else if(rank == 1) { 
32 
33             peer = 0 ; 
34             Status status = MPI.COMM_WORLD.Recv(buffer, 0, buffer.length, 35                                                 MPI.INT, peer, tag); 
36             System.out.println("process <"+rank+"> recv'ed a msg\n"+ 37                                "\tdata   <"+buffer[0]    +"> \n"+ 38                                "\tsource <"+status.source+"> \n"+ 39                                "\ttag    <"+status.tag   +"> \n"+ 40                                "\tcount  <"+status.count +">") ; 
41 
42         } 
43 
44         MPI.Finalize(); 
45 
46     }  
47 
48 }

MPJ Expressなどのメッセージングライブラリによって提供される最も一般的な機能の1つは、実行中のプロセス間のポイントツーポイント通信のサポートです。このコンテキストでは、同じコミュニケーター(たとえばMPI.COMM_WORLDコミュニケーター)に属する2つのプロセスは、メッセージを送受信することで互いに通信できます。 Send()メソッドのバリアントを使用して、送信者プロセスからメッセージを送信します。一方、送信されたメッセージは、Recv()メソッドのバリアントを使用して受信側プロセスで受信されます。送信側と受信側の両方が、受信側で一致する着信メッセージを見つけるために使用されるタグを指定します。

行12でMPI.Init(args)メソッドを使用してMPJ Expressライブラリを初期化した後、プログラムはそのランクとMPI.COMM_WORLDコミュニケーターのサイズを取得します。両方のプロセスは、行18のバッファーと呼ばれる長さ10の整数配列を初期化します。送信側プロセス(ランク0)は、msg配列の最初の要素に値10を格納します。 Send()メソッドのバリアントを使用して、msg配列の要素を受信側プロセスに送信します。

送信側プロセスは、27行目でSend()メソッドを呼び出します。最初の3つの引数は、送信されるデータに関連しています。送信側のbu!er — bu!er配列は、最初の引数の後に0(o!set)と1(count)が続きます。送信されるデータはMPI.INTタイプで、宛先は1(ピア変数)です。データ型と宛先は、Send()メソッドの4番目と5番目の引数として指定されます。最後の6番目の引数はタグ変数です。タグは、受信側でメッセージを識別するために使用されます。メッセージタグは通常、特定のコミュニケーター内の特定のメッセージの識別子です。一方、受信プロセス(ランク1)は、ブロッキング受信メソッドを使用してメッセージを受信します。

18
Adil Mehmood

Javaはスレッドをサポートしているため、マルチスレッドを使用できますJavaアプリケーション。ConcurrentProgramming in Java:Design Principles and Patternsbookそのために:

http://Java.Sun.com/docs/books/cp/

9
Manuel Selva

Java Parallel Processing Framework( [〜#〜] jppf [〜#〜] )を見たい

8
John Channing

Hadoop および Hadoop Wiki をご覧ください。これは、Googleのmap-reduceに触発されたApacheフレームワークで、複数のシステムを使用して分散コンピューティングを行うことができます。 Yahooのように、Twitterはそれを使用します( Sites Powered By Hadoop )。使用方法の詳細については、この本を参照してください Hadoop Book

7
Emil

これは、私が過去に指摘した並列プログラミングリソースです。

http://www.jppf.org/

誰かがそれを少し前に推薦したというだけで、私はそれが良いかどうかわからない。

3
Richard

Ateji PX parallel-forループはあなたが探しているものですか?これにより、すべてのサイトが並行してクロールされます(forキーワードの横にある二重バーに注意してください)。

for||(Site site : sites) {
  crawl(site);
}

クロールの結果を作成する必要がある場合は、おそらく次のような並列理解を使用する必要があります。

Set result = set for||{ crawl(site) | Site site : sites }

ここでさらに読む: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

2
Patrick Viry

Javaランタイムライブラリの一部であるスレッドを使用して並列処理が行われます

同時実行性チュートリアル は、Javaおよび並列プログラミング。

2
stacker

私は数年前の会議でそれについて聞いたことがあります- ParJava 。しかし、プロジェクトの現在の状況についてはわかりません。

2
grigy

私の知る限り、ほとんどのオペレーティングシステムでは、Javaのスレッドメカニズムは実際のカーネルスレッドに基づいている必要があります。これは、並列プログラミングの将来性から優れています。 Pythonのような他の言語は、単にプロセッサの時間多重化を行います(つまり、マルチプロセッサマシンで重いマルチスレッドアプリケーションを実行すると、1つのプロセッサのみが実行されます)。

それをグーグル検索するだけで簡単に見つけることができます。例として、これは「Javaスレッド」の最初の結果です。 http://download-llnw.Oracle.com/javase/tutorial/essential/concurrency/

基本的には、Threadクラスを拡張し、「run」メソッドを他のスレッドに属するコードでオーバーロードし、拡張したクラスのインスタンスで「start」メソッドを呼び出します。

また、何かスレッドセーフにする必要がある場合は、 同期メソッド をご覧ください。

2
Dacav

Java.util.concurrencyパッケージとBrian Goetzの本「Java concurrency in practice」

Ralph Johnson(GoFデザインパターンの作成者の1人)による並列パターンに関する多くのリソースもここにあります。 http://parlab.eecs.berkeley.edu/wiki/patterns/patterns

2
Bruno Thomas

平行度

並列処理とは、アプリケーションがタスクを小さなサブタスクに分割し、複数のCPU上でまったく同時に処理できるように並列処理できることを意味します。 enter image description here

1
Pavan Reddy

これを見ましたか:

http://www.javacodegeeks.com/2013/02/Java-7-forkjoin-framework-example.html?ModPagespeed=noscript

フォーク/参加フレームワーク?

私もこれについて少し学ぼうとしています。

1
dagadbm

Javaチュートリアル。 http://download-llnw.Oracle.com/javase/tutorial/essential/concurrency/procthread.html のスレッドのセクションを読んでください。

Hadoopをチェックしてみてください。任意の量のボックスでジョブを実行するように設計されており、すべての簿記を処理します。これは、GoogleのMapReduceとその関連ツールに触発されたもので、Webインデックス作成からも生まれています。

1
Nicolas78

Java SE 5および6では、Java.util.concurrent。*に一連のパッケージが導入され、強力な同時実行性ビルディングブロックが提供されます。詳細については、これを確認してください。 http://www.Oracle.com/technetwork/articles/Java/fork-join-422606.html

0
user3403531

Habanero-Java (HJ)というライブラリがあります。これは、ライス大学で開発され、 lambda式 を使用して構築され、任意のJava = 8 JVM。

HJ-libは、さまざまな並列プログラミング構成(非同期タスク、フューチャー、データ駆動タスク、forall、バリア、フェーズ、トランザクション、アクターなど)を単一のプログラミングモデルに統合し、これらの構成の独自の組み合わせ(ネストなど)タスクとアクターの並列性の組み合わせ)。

HJランタイムは、HJタスクの作成、実行、終了を調整し、ワークシェアリングとワークスティーリングの両方のスケジューラを備えています。チュートリアルに従って、コンピューターにセットアップすることができます。

次に、簡単なHelloWorldの例を示します。

import static edu.rice.hj.Module1.*;

public class HelloWorld {

public static void main(final String[] args) {

    launchHabaneroApp(() -> {

        finish(() -> {
            async(() -> System.out.println("Hello World - 1!"));
            async(() -> System.out.println("Hello World - 2!"));
            async(() -> System.out.println("Hello World - 3!"));
            async(() -> System.out.println("Hello World - 4!"));
        });

    });
}}

asyncメソッドは、他のasyncメソッドと並行して実行されますが、これらのメソッド内のコンテンツは順次実行されます。プログラムは、finishメソッド内のすべてのコードが完了するまで続行しません。

0
Amanda Nguyen

jCSP( http://www.cs.kent.ac.uk/projects/ofa/jcsp/ )を使用できます。ライブラリはJavaでCSP(Communicating Sequential Processes)原則を実装し、スレッドレベルであり、代わりにプロセスを処理します。

0
user1125516

サンプルライブラリを使用した簡単な回答

Javaを使用した並列処理に興味がある場合は、Hazelcast Jetを試してみることをお勧めします。

私の側からこれ以上言葉は必要ありません。ウェブサイトを確認し、その例で学ぶだけです。データを完全に処理することの意味について、かなり堅実な背景と想像力を与えます。

https://jet.hazelcast.org/

0
Daniel Perník

Parallel Java 2 Library を試してみてください。

アラン・カミンスキー教授はウェブサイトで次のように書いています:

PJ2の開発を開始した2013年に早送りします。並列コンピューティングは、10年前をはるかに超えて拡大していました。マルチコアパラレルコンピューターには、より多くのCPUコアとはるかに大きなメインメモリが装備されていたため、クラスター全体を必要としていた計算が単一のマルチコアノードで実行できるようになりました。新しい種類の並列計算ハードウェア、特にグラフィック処理ユニット(GPU)アクセラレータが一般的になりました。 AmazonのEC2などのクラウドコンピューティングサービスにより、誰でも数千のコアを持つ仮想スーパーコンピューターで並列プログラムを実行できました。並列コンピューティングの新しいアプリケーション分野、特にビッグデータ分析が開かれました。 GPU並列プログラミング用のOpenCLやNVIDIA CorporationのCUDAなどの新しい並列プログラミングAPI、およびビッグデータコンピューティング用のApacheのHadoopなどのmap-reduceフレームワークが登場しました。これらのすべての傾向を調査して活用するために、まったく新しいParallel Java 2 Libraryが必要であると判断しました。

2013年初頭にPJ2はまだ利用できませんでした(以前のバージョンは利用できましたが)、私はJava Parallel Processing Framework(JPPF)。 JPPFは大丈夫でしたが、一見PJ2面白そうです。

0
H2ONaCl