問題タブ [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.
scala - ParMap 値メソッドの代替
ParMap (Scala 2.9) には .values メソッドがないようです。これはなぜですか?また、次のような並列処理チェーンを維持することに特に熱心な場合、どうすれば回避できますか?
scala - 祖先型への参照を介して並列コレクションで map を呼び出す
map
たとえば、次のコードを使用して、操作を順次または並列に実行することをオプションにしようとしました。
私が気付いたのは、「マップ」操作が期待どおりに並行して実行されないことです。条件なしでは、次のようになります。
(if(runParallel) theList else theList.par)
両方のタイプの最も近い共通の祖先であると予想されるtheList
式のタイプtheList.par
は、ここには貼り付けない恐ろしいタイプですが、見るのは興味深いものです (scala コンソール経由:)
map
並列コレクションで並列に動作しないのはなぜですか?
更新: これはSI-4843で議論されていますが、JIRA チケットからは、Scala 2.9.x でなぜこれが起こったのかは明らかではありません。
scala - Scala 並列順不同イテレーター
特定の順序で実行する必要がIterable
ある「作業単位」があり、互いに干渉することなく簡単に並行して実行できます。
残念なことに、一度に実行しすぎると、使用可能な RAM を超えるので、常に少数しか同時に実行しないようにする必要があります。
最も基本的には、この型シグネチャの関数が必要です。
そのため、出力Iterator
は必ずしも入力と同じ順序であるとは限りません (結果がどこから来たかの知識を維持したい場合は、入力または何かとのペアを出力できます)このタスクで可能な限り多くの並列処理を維持しながら、マシンのすべてのメモリを使い果たします。
さらに、機能をできるだけ効率的にしたいと考えています。私が最初に思いついたのは、たとえば次のようなことをすることでした。
toSet
ここで、 Scala の並列コレクションに、イテレータから要素の準備が整うとすぐに任意の順序で要素の生成を開始できることを通知し、grouped
呼び出しは同時ワーカーの数を制限することを望んでいました。残念ながら、呼び出しが望ましい効果を達成しているようには見えません(私の実験では、呼び出しtoSet
がなかった場合と同じ順序で結果が返されます)。par
grouped
呼び出しは最適ではありません。たとえば、グループ サイズが 100 で、そのうちの 99 個のジョブが 12 個のコアですぐに完了するが、そのうちの 1 つが特に遅い場合、残りのコアのほとんどは、次のグループに移動できるまでアイドル状態になります。最大で私のチャンクサイズと同じ大きさの「適応ウィンドウ」を持つ方がはるかにきれいですが、遅いワーカーに遅れることはありません。
ワークスティーリング (デ) キューなどを使用して、このようなものを自分で作成することを想像できますが、並行プリミティブを処理するための多くの困難な作業は、Scala の並列処理のあるレベルで既に行われていると思います。コレクション ライブラリ。この機能を構築するために再利用できる部分を知っている人はいますか、またはそのような操作を実装する方法について他の提案がありますか?
scala - X.par.viewとX.view.parを使用してScala並列ビューを構築しますか?
パラレルコレクションとインターネットでの検索に関する論文によると、パラレルコレクションはビューで機能するはずですが、私はそれらの違いについて明確ではありません
と
coll.view.par
コレクションの見やすさが失われているようです。
でも理由はわかりません。それは機能ですか、それともバグですか?
scala - ForkJoinPoolのsetMaximumPoolSizeの置き換え
Scala 2.9。*以降、setMaximumPoolSize
メソッドが消えたForkJoinPool
ように見え、私が望むことを実行しているように見えることに気づきました。Scalaの並列コレクションで並列処理を制限することに関するほとんどの議論は、同じクラスのメソッドを中心にしてsetParallelism
います(これも消えましたが、私にとってはそれほど問題ではありません)が、私の場合、並列タスクは外部IOを実行でき、多くの場合ブロックされますその上に。次にForkJoinPool
、その場合により多くのスレッドを起動し、問題の共有IOリソースに対してDOSを効果的に実行しますが、これは望ましくありません。
何らかの方法でプール内のスレッドの数を制限する方法はありますか?IOでブロックされたときにスポーンする動作についてはあまり気にしませんが、IOタスクは独立しており、相互に干渉しないため、ある程度の並列処理が必要です。
scala - Scala 2.9 での並列処理
~10K 要素の配列があり、配列のすべての要素を処理する必要があるとします。K
要素のみが並列処理されるように処理したいと思います。
私は使用しますScala 2.9
。並列コレクションを試しましたが (以下を参照)、複数のK
要素が並列処理されていることがわかりました。
要素Scala 2.9
のみが並列処理されるような方法で配列を処理する方法を提案しますか?K
scala - scala/akka アプリで使用できるスレッドの数を制限する方法
scala 並列コレクションと akka アクターを使用するアプリケーションを作成しました。その「強力なスケーリング」特性、つまり、利用可能なコア/スレッドの数の関数として、特定の問題インスタンスの実行時間がどのように変化するかを調べたいと思います。 .
これについての適切な方法は何でしょうか?最大 n 個のコア/スレッドのみを使用するようにアプリケーションに指示するにはどうすればよいですか?
scala - パラレルマップ操作?
Scala は、標準言語の一部として並列マップ操作を実行する方法を提供していますか?
たとえば、次のようになります。
できます:
ただし、私の知る限り、これは提供された関数をリスト オブジェクトに順次マップします。関数を個別のスレッド (または同等のもの) の各要素に適用し、結果を結果リストにまとめる組み込みの方法はありますか?