問題タブ [parallel-collections]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
689 参照

scala - 必要な数の結果が見つかったときに早期に中止してScalaの並列コレクションをフィルタリングする

collection.parallel.mutable.ParHashMap (または他の並列コレクション)の非常に大きなインスタンスが与えられた場合、特定の、たとえば50の一致数が見つかったら、どのようにしてフィルタリング並列スキャンを中止できますか?

スレッドセーフな「外部」データ構造に中間一致を蓄積しようとしたり、結果カウントを含む外部AtomicIntegerを維持したりすることは、通常のcollection.mutable.HashMapを使用して単一コアを100にペギングするよりも、4コアで2〜3倍遅いようです。%。

Par *コレクションの検索または存在は、「内部」で中止されることを認識しています。これを一般化して複数の結果を見つける方法はありますか?

これは、ParHashMapで約79,000エントリの場合でも2〜3倍遅いように見え、maxResultsの結果よりも多くの結果を結果のCHMに詰め込むという問題もあります(これはおそらく、incrementAndGetの後、 breakの前にスレッドがプリエンプトされたためです)他のスレッドが要素を追加できるようにします)。更新:速度の低下は、counter.incrementAndGet()で競合するワーカースレッドが原因であるようです。これはもちろん、並列スキャン全体の目的を無効にします:-(

0 投票する
2 に答える
602 参照

scala - 並列の存在と検索を理解する

を取り、並行して値をList[Int]検索したい。したがって、リストに 51 以上の値が含まれている場合は返されます。xx * 10 > 500existstrue

結果は次のとおりです。

Scala 2.9.1 を搭載したデュアルコア マシンを使用しています。

何が起きてる?これは意図したとおりに機能していますか? 最初の結果が見つかるとすぐに、他のスレッドにメッセージを送信してミッションを中止しないのはなぜですか? fが高価な計算である場合、これは非常にコストがかかる可能性があります。

findドキュメントには、「要素は必ずしも反復順序の最初の要素であるとは限らない」および「選択は非決定論的である」と書かれていますが、同様の方法で機能し、さらに多くの値を検索しているようです。

0 投票する
1 に答える
561 参照

scala - 並列コレクションでビューを使用できますか?

コレクションのマッピング内で結果を見つけるためのイディオムは次のようになります。

ここでlistは 、List[A]fA => BpですB => Boolean

view並列コレクションで使用できますか? 非常に奇妙な結果が得られているため、質問します。

0 投票する
2 に答える
444 参照

scala - RAM 不足のための Scala 並列

そのため、宿題では、pi になるはずの関数の単純な統合を使用して、いくつかのスレッド化メカニズムで遊ぶことになっています。実装は、5000 億を超える間隔を処理することになっています。私の現在の実装では、2GB のヒープ サイズで最大約 5,000 万の for ループを処理します。ここで私の質問は、なぜ実装がそれほど多くのメモリを使用するのですか? (範囲を事前に作成する必要があるためだと思いますが、これは本当ですか?)そして、メモリ使用量を改善するにはどうすればよいですか?並列コレクションを使用することは可能ですか、それともこのような目的でスレッド プールを使用する必要がありますか?

注:次の実装で完全なクレジットを取得します。これは、私の知的好奇心と、scala をもっと流暢に使いこなせるようになるという私の夢のためです。

0 投票する
3 に答える
1106 参照

scala - 複数のコアへの作業の分散:HadoopまたはScalaの並列コレクション?

Scala / Hadoopシステムで並列処理するために複数のコアを最大限に活用するためのより良い方法は何ですか?

1億のドキュメントを処理する必要があるとしましょう。ドキュメントはそれほど大きくはありませんが、ドキュメントの処理には計算量が多くなります。それぞれ10コアの100台のマシンを備えたHadoopクラスターがある場合、次のいずれかを実行できます。

A)各マシンに1000のドキュメントを送信し、Hadoopに10個のコア(または利用可能な数)のそれぞれでマップを開始させます

また

B)各マシンに1000個のドキュメントを送信し(引き続きHadoopを使用)、Scalaの並列コレクションを使用して複数のコアを最大限に活用します。(すべてのドキュメントを並列コレクションに入れてから、コレクションを呼び出しますmap)。つまり、クラスターレベルでの配布にはHadoopを使用し、並列コレクションを使用して各マシン内のコアへの配布を管理します。

0 投票する
3 に答える
1664 参照

scala - Scalaでの並列コレクションの効率/スケーラビリティ(グラフ)

ですから、私が取り組んでいるグラフプロジェクトのためにScalaで並列コレクションを使用してきました。グラフクラスの基本を定義しました。現在scala.collection.mutable.HashMap、キーがどこにIntあり、値がListBuffer[Int](隣接リスト)である場所を使用しています。 。(編集:これはその後に変更されましたArrayBuffer[Int]

私は数ヶ月前にC++で同様のことをしましたstd::vector<int, std::vector<int> >

私が今やろうとしているのは、グラフ内の頂点のすべてのペア間でメトリックを実行することです。そのため、C++では次のようにしました。

私はこれを行うことで、Scalaで同じことを並列化しました(または試みました)。

C ++バージョンは明らかにシングルスレッドですが、Scalaバージョンは.par並列コレクションを使用しており、8コア(同じマシン)でマルチスレッドになっています。ただし、C ++バージョンは約3日間で305,570ペアを処理しましたが、Scalaバージョンはこれまでのところ17時間で23,573ペアしか処理していません。

私が正しく計算したと仮定すると、シングルスレッドのC++バージョンはScalaバージョンよりも約3倍高速です。Scalaは本当にC++よりもはるかに遅いのでしょうか、それとも私はScalaを完全に誤用しているのでしょうか(私は最近始めたばかりです-私はScalaでプログラミングを始めたばかりです)。

ありがとう!-kstruct

編集whileループを使用するには、次のようなことをしますか。

全体にwhileループを使用するという意味の場合、whileに相当するものはあり.par.foreachますか?

EDIT2ちょっと待ってください、そのコードは正しくありません-私の悪いです。whileループを使用してこれを並列化するにはどうすればよいですか?var i反復を追跡するものがある場合、すべてのスレッドがそれを共有しているのではないでしょiうか?

0 投票する
2 に答える
518 参照

scala - シーケンシャル コレクションをゼロから作成する場合と比較して、並列コレクションに変換するコストはいくらですか

公式ドキュメントによると、並列コレクションを作成するには 2 つのオプションがあります。

1)

2)

さて、違いは何ですか?単純な順次コレクションから変換すると、パフォーマンスが低下しますか?

少し並列なコレクション (たとえば、数千の要素) を作成する必要がある場合、最初から作成するか、変換しますか?

君たちありがとう!

編集:

@oxbow_lakes が言うように、このトピックに焦点を当てたドキュメントがありますが、私は「経験豊富なアドバイス」を得ようとしています。たとえば、DB から大きなコレクションを読み取る必要がある場合、あなたはどうしますか。

0 投票する
2 に答える
1578 参照

scala - 大きなリストに対して `...par.map(` を直接実行するのは良い考えですか?

文字列のやや大きな (数百万項目程度) リストがあるとします。次のようなものを実行することをお勧めします。

...par.map(または、次のように、実行する前にリストをグループ化することをお勧めします。

更新:それは非常に高価であることを考えると( 、などsomeActionと比較して)groupedtoList

0 投票する
1 に答える
354 参照

scala - アクターなしで Scala で同時に HashMap を変更する

私がやりたいことは、 a の実装を使用して開始しMap、並列コレクションを反復処理してデータを蓄積することです。キーは確率的に生成されるため (乱数の生成に関連)、スレッド間でキーが「重複」する可能性があります。

元。スレッド 1 は、キー = A 値 = 1 をマップに追加しようとしています。すでに存在する場合は、既存の値に 1 を追加します (値が 1 であるため)。存在しない場合は、マッピングを作成します。一方、別のスレッドはキー = A と値 = 2 を持ち、同じことをしたいと考えています。

システム全体を作成せずにこれを行う方法はありActorますか?

ConcurrentHashMapJavaのライブラリからのものは興味深いように見えますが、「弱い一貫性のある」イテレータは、スレッド間でマップを更新することの安全性に関して私を悩ませています..

0 投票する
2 に答える
311 参照

java - Java コレクションから Scala 並列コレクションを作成する方法

Java コレクションを同等の Scala に変換する最も簡単な方法は、Scala 2.8 以降、JavaConversions を使用することです。. これらの暗黙的な定義は、含まれている Java コレクションのラッパーを返します。

Scala 2.9 では、コレクションに対する操作を並行して実行し、後で結果を収集できる並列コレクションが導入されました。これは簡単に実装できます。既存のコレクションを並列コレクションに変換するのは次のように簡単です。

しかし、JavaConversions を使用して Java コレクションから変換されたコレクションで「par」を使用すると問題が発生します。Parallel Collection Conversionsで説明されているように、本質的にシーケンシャルなコレクションは、すべての値を評価して新しい並列コレクションに追加することにより、新しい並列コレクションに「強制」されます。

リスト、キュー、ストリームなどのその他のコレクションは、要素に次々にアクセスする必要があるという意味で、本質的にシーケンシャルです。これらのコレクションは、要素を同様の並列コレクションにコピーすることによって、並列バリアントに変換されます。たとえば、機能リストは、並列ベクトルである標準の不変並列シーケンスに変換されます。

これは、元の Java コレクションが遅延評価されることを意図している場合に問題を引き起こします。たとえば、Java Iterable のみが返され、後で Scala Iterable に変換された場合、Iterable のコンテンツが積極的にアクセスされることを意図しているかどうかの保証はありません。では、各要素を評価するコストを負担することなく、Java コレクションから並列コレクションを作成するにはどうすればよいでしょうか? 並列コレクションを使用してそれらを並列に実行し、提供される最初の n 個の結果を「取得」することで回避しようとしているのは、このコストです。

Parallel Collection Conversionsによると、一定の時間がかかる一連のコレクション型がありますが、これらの型を JavaConversions で作成できることを保証する方法はないようです (たとえば、'Set' は作成できますが、それは「HashSet」ですか?)。