問題タブ [plinq]
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.
c# - この foreach ループを並列実行に変換するための正しい PLINQ 構文は何ですか?
更新 2011-05-20 12:49AM: 私のアプリケーションでは、foreach は並列ソリューションよりも 25% 高速です。また、最大並列処理にコレクション数を使用しないでください。マシンのコア数に近いものを使用してください。
=
並行して実行したい IO バインド タスクがあります。フォルダ内のすべてのファイルに同じ操作を適用したい。内部的には、操作の結果、計算されたファイル情報を UI スレッドのコレクションに追加する Dispatcher.Invoke が生成されます。したがって、ある意味では、作業結果はメソッド呼び出しの副作用であり、メソッド呼び出しから直接返される値ではありません。
並列実行したいコアループです
このループのコンテキストは次のとおりです。
助けてくれてありがとう!
+トム
c# - ConcurrentQueue の PLINQ はマルチスレッドではありません
C# プログラムに次の PLINQ ステートメントがあります。
arrestQueue
とはどちらwriteQueue
もConcurrentQueuesです。
並行して実行されているものはありません:
- 実行中の合計 CPU 使用率は約 30% であり、これは他のすべてが実行されている場合でも同様です。私は 8 つのコア (4 つの物理コアを備えた Core i7 720QM でのハイパースレッディング) を持っていますが、8 つのコアのうち 4 つが実質的にまったく使用されていません。残りは約 40%-50% 実行されます。
- 通常、ディスク使用率は 0% であり、localhost 上の Postgres DB へのクエリを除いて、ネットワーク使用率はありません (以下を参照)。
- 内部のどこかにブレークポイントを追加すると
geocodeThis.Geocode()
、Visual Studio のThreadドロップダウンには[ pid ] Main Threadとだけ表示されます。他のスレッドに移動することはありません。 - 私はNpgsqlを使用して Postgres に接続しており、各スレッドはテーブルに対していくつかのSELECTクエリを実行しています。pg_stat_activityを示す pgAdmin III の Server Status アプリを実行しています。これと、戦略的なブレークポイントの配置 (上記を参照) を監視することで、同時実行されていると思われるすべてのスレッドに対してアプリが複数のデータベース接続を開くことは決してないこと
geocodeThis.Geocode()
がわかります。DB 接続文字列にPooling=falseを追加して、接続がプールされないように強制しても、 で複数の接続が使用されることはありませんgeocodeThis.Geocode()
。 - Postgres テーブルは、 WHERE句のすべての列でインデックスが作成されます。インデックスが不十分だったとしても、大量のディスク使用量が予想されます。Postgres が他の方法で物事を保持していた場合、それはコアを浸すように思われます。
これは単純な PLINQ のケース スタディのように思えますが、なぜ何も並行して実行されないのか頭を悩ませています。
.net - DomainService クエリ操作で PLinq を使用したパフォーマンスの向上
ドメイン サービスのクエリ操作で .AsParallel() 拡張機能を使用すると、パフォーマンスの向上を期待できますか。DomainService は、リポジトリ (EntityFramework) を使用してデータをクエリし、クエリ操作によって返されるクライアントの ViewModel を構築します。
私の DomainService での簡単なクエリ操作は次のとおりです。
PLinq を使用して高速化できる場合、どこに .AsParallel() 呼び出しを追加すればよいですか?
ここ
そこには
またはそこに
c# - 大きな csv ファイル ライターの最適化 - TPL PLINQ を使用した大きなテーブル データリーダー
TPL や PLINQ を使用して以下をさらに最適化する方法に関するヒント。
以下のコードはバックグラウンドワーカーで実行されます
ありがとうございました。
linq - C#: 連鎖した Linq メソッドとキャスト
私はいくつかの衝突検出を実装した小さなゲームを持っています。現在の「エンティティ」オブジェクトと衝突している、特定のタイプのすべてのアイテムのリストを取得したいと考えています。私はこのようなことをしたい:
次のエラーが表示されます。
なぜこれが起こるのか、誰でも説明できますか?
ありがとうございました!
c# - 特定の plinq クエリ
C#で最大値を持つIDを1つ選択したいdictionary<int, double>
例えば
初期辞書
選択後
私の現在のコード
c# - PLINQ:4つ以上のスレッドでParallelQueryを実行する方法は?
更新-質問のタイトルを変更して、私が本当に求めているものを反映させました
次のコードについて考えてみます。
の呼び出しを省略するとWithDegreeOfParallelism
、これは4つのチャンクで実行され、合計で約4秒かかります。これは、CPUカウントが3であるため、予想されることです。
ただし、4を超える番号で呼び出すWithDegreeOfParallelism
と、常に3つのチャンクが取得され、合計時間は3秒未満にはなりません。値が12の場合、合計時間は(1秒強)1秒になると思います。
私は何が欠けていますか?そして、CPUを集中的に使用しない4つ以上のタスクの並列実行を強制するにはどうすればよいですか?
更新:もちろん手動でスレッドをスピンアップすることに戻ることもできますが、新しいPFXライブラリによってこれが少し簡単になることを期待していました...とにかく、以下のコードは約1秒の合計実行時間を与えます
c# - WinForms アプリケーションで PLINQ クエリをキャンセルする方法
単語の出現に関する統計を収集する大量のテキストデータを処理するアプリケーションに取り組んでいます (参照:ソースコード Word Cloud )。
ここで、コードの単純化されたコアが何をしているのかを示します。
- *.txt 拡張子を持つすべてのファイルを列挙します。
- 各テキスト ファイル内の単語を列挙します。
- 単語ごとにグループ化し、出現回数を数えます。
- 発生順に並べ替えます。
- トップ20を出力します。
すべてがLINQでうまくいきました。PLINQ に移行したことで、パフォーマンスが大幅に向上しました。しかし...長時間実行されているクエリ中のキャンセル可能性は失われます。
OrderBy クエリがデータをメイン スレッドに同期しており、Windows メッセージが処理されていないようです。
以下の例では、 MSDN How to: Cancel a PLINQ Query whic not work :(に従って、キャンセルの実装をデモンストレーションしています。
他のアイデアはありますか?
c# - CancellationTokenSourceをいつ破棄するのですか?
クラスCancellationTokenSource
は使い捨てです。Reflectorをざっと見てみるとKernelEvent
、(非常に可能性が高い)管理されていないリソースの使用法がわかります。CancellationTokenSource
ファイナライザーがないので、処分しないとGCは行いません。
一方、MSDNの記事「マネージスレッドでのキャンセル」にリストされているサンプルを見ると、トークンを破棄するコードスニペットは1つだけです。
コードでそれを処分する適切な方法は何ですか?
- 並列タスクを開始するコードを
using
、それを待たなければラップすることはできません。そして、あなたが待たない場合にのみキャンセルをすることは理にかなっています。 - もちろん
ContinueWith
、電話でタスクを追加することもできますがDispose
、それはその方法ですか? - 同期を取り戻さず、最後に何かを実行するキャンセル可能なPLINQクエリについてはどうでしょうか。言いましょう
.ForAll(x => Console.Write(x))
? - 再利用できますか?同じトークンを複数の呼び出しに使用して、それをホストコンポーネント、たとえばUIコントロールと一緒に破棄することはできますか?
Reset
クリーンアップIsCancelRequested
とフィールド化のメソッドのようなものがないため、Token
再利用できないと思います。したがって、タスク(またはPLINQクエリ)を開始するたびに、新しいタスクを作成する必要があります。それは本当ですか?Dispose
はいの場合、私の質問は、これらの多くのCancellationTokenSource
インスタンスで対処するための正しく推奨される戦略は何ですか?
c# - Task.Wait in ContinueWhenAll アクション
私は、物事をキューに入れるためにスレッドを Azure コードに組み込むことに取り組んでいました。これを行うために、 http://www.microsoft.com/download/en/details.aspx?id=19222を参照として使用しました。
複数のメッセージをキューに入れるコードは次のようになります。
今、私の質問は、継続中の Task.Wait についてです (これは、MS によって提供されたドキュメントによるものです)。すでに完了したことがわかっているスレッドを待つのは少し奇妙に思えますか? 私が想像できる唯一の理由は、エラーをバブルして処理することです。私はここで何かを逃していますか?