問題タブ [parallel-extensions]
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# - 並列無限ループを実現するための最良の方法は何ですか?
.Netの並列拡張機能でParallel.For()を使用することに慣れました。これは、スレッドを手動で開始して維持する必要がなく、コードを並列化する簡単な方法であるためです(面倒な場合があります)。私は今、並列化したい無限ループ(停止するように信号を送るまで何かをする)を見ています、これを行うための引数のないParallel.For()オーバーロードはないので、ここでの最良のアプローチは何でしょうか?なれ。原則として、私は次のようなことを行うことができます。
しかし、それは作業分割ロジックが処理するための期待される/効率的なパターンではないかもしれないと私は思っています(?)
別のオプションは次のようなものです。
しかし、それはエレガントではないように思われ、非効率的な作業分割につながる可能性もあります。
今のところ、私の本能は、自分のスレッドを作成して維持することによってこれを手動で行うことですが、これに関するフィードバック/意見を得ることに興味があります。ありがとう。
===更新===
受け入れられた回答の記事のコードの簡略化されたバージョンを使用しています(ParallelOptionsパラメーターを削除しました)。これがコードです...
使用例は次のとおりです。
c# - PLINQ の使用時にメモリ不足の例外を回避するにはどうすればよいですか?
こんにちは、ご覧いただきありがとうございます。
バックグラウンド
多くの時間を必要とする計算タスク、または並列計算があります。
具体的には、約 50 個の画像のリストをループ処理し、それらを Base64 でエンコードしてから、新たにエンコードされた各アイテムと、約 2000 個の Base64 文字列でエンコードされた画像を含む XML ファイル内の値との間のレーベンシュタイン距離を計算して、最小の Lev を持つ XML ファイル。ベンチマーク文字列からの距離。
通常のforeach
ループは機能しますが、遅すぎるため、Core i7 マルチコア プロセッサを利用するために PLINQ を使用することにしました。
タスクは見事に開始され、高速で実行されますが、「メモリ不足」の例外が発生します。
C#、.NET 4、Forms アプリを使用しています。
質問
使用可能なメモリが不足しないように PLINQ コードを微調整するにはどうすればよいですか?
アップデート/サンプルコード
PLINQ を開始するために呼び出されるメソッドを次に示しforeach
ます。
. . .そして、ここにレーベンシュタイン距離法があります:
前もって感謝します!
c# - Parallel ライブラリを使用してリストに追加するときにスレッド セーフを保証する正しい方法
接続文字列の配列をループし、各ループでいくつかの情報を抽出してリストに追加します。今、並列ライブラリを使用してマルチスレッド化したいと考えていますが、リストへの書き込みがスレッドセーフであることをライブラリが保証するかどうか、またはロックを使用する必要があるかどうかはわかりません。
c# - 単一のワークフローインスタンスを並行して実行する
ワークフローがあり、それを何度も並行して実行したいとします。
このように実行することは合法ですか?
c# - MaxDegreeOfParallelismは何をしますか?
Parallel.ForEachを使用しており、データベースの更新を行っていますが、MaxDegreeOfParallelismを設定せずに、デュアルコアプロセッサマシンでSQLクライアントがタイムアウトします。それ以外の場合、クアッドコアプロセッサマシンはタイムアウトしません。
これで、コードを実行する場所で使用できるプロセッサコアの種類を制御できなくなりましたが、MaxDegreeOfParallelismで変更できる設定がいくつかあります。これにより、同時に実行される操作が少なくなり、タイムアウトが発生しなくなります。
タイムアウトを増やすことはできますが、CPUの負荷が低い場合に同時に処理できる操作が少なくなると、CPUへの負荷が少なくなるため、適切な解決策ではありません。
他のすべての投稿とMSDNも読みましたが、MaxDegreeOfParallelismを低い値に設定すると、クアッドコアマシンが問題になりますか?
たとえば、CPUに2つのコアがある場合、20を使用し、CPUに4つのコアがある場合、40のようなことを行う方法はありますか?
c# - .net並列および直列ループ
ソリューション内の特定のループの周りにパターンを構築して、要因に応じてそれらをシリアルまたはパラレルで実行できるようにします。以下はその一般的な形式です。
並行コレクションは通常のコレクションと共通のインターフェースを共有しないため、一般的なコードを作成するには、ある種のアダプターが必要です。
特にループ本体でのデリゲートの使用に関してaddFunc
、長期的に見落とす可能性のある問題を引き起こす可能性のあるものはありますか?今のところ問題なく動作しますが....?
.net - MemoryBarriers と Parallel Extensions
Parallel Extensions を使用する場合、MemoryBarriers について考慮する必要はありますか?
編集 - 元の質問が自由回答形式だったので詳しく説明します: (@xanatos の回答は私が探していたものでした)
具体的な例を挙げると、Parallel.ForEach を使用し、各反復がクラス内のプロパティの値を設定するとします (各反復は独自の特定のプロパティを設定し、2 つの反復で同じプロパティの値を設定することはありません)。Parallel.ForEach を呼び出した同じスレッドで、Parallel.ForEach から設定されたプロパティにアクセスします。
c# - タスク並列ライブラリを使用して複数のタスクを実行し、最初のタスクの後に戻って実際にデータを返すにはどうすればよいですか?
私は、データをできるだけ早くシリアルプロセスに戻すことが重要であるアプリケーションに取り組んでいますが、そのデータを取得するソースは複数存在する可能性があります。また、一方のソースがもう一方のソースよりも高速である場合もありますが、どのソースになるかはわかりません。続行して呼び出し元のメソッドから戻るために、ContinueWhenAny(...)。Wait()を使用して最初のタスクが終了するのを待ちます。ただし、最初にデータの有効性を確認してから戻る必要があります(または、すべてのタスクが終了し、有効なデータがない場合)。今のところ、それが最初に終了するタスクである場合、私のコードは無効なデータも返します。
「ContinueWhenAny」のようなことを行う方法はありますが、Task.Resultが特定の条件を満たす場合にのみ、それ以外の場合は、最後のタスクが終了するまで次のタスクなどを待ちますか?
同様に、1つの結果が有効になった後、他のスレッドがキャンセルされることを確認する必要があります。この部分はすでに正常に機能しています。
現在、私のコードは次のようになっています(例外処理が削除され、要点だけが削除されています)。
何か案は?最初の呼び出しに2秒かかり、2番目の呼び出しに10秒かかる場合、最初の呼び出しが有効なデータを返す場合は2秒でシリアルプロセスに戻りたいので、ContinueWhenAllを使用したくありません。それ以外の場合は、10秒待ちます。結果には有効なデータがあり、すべてのタスクが完了して無効な結果を返した場合にのみ無効なデータを返します。
---------更新----素晴らしいアイデアをありがとうzmbq。更新された(動作する)コードは以下のとおりであり、私のすべての要件を満たしています。ただし、このコードと前のコードの違いは、無効な結果自体を返す前のコードではなく、どのタスクも有効な結果を生成しない場合、このコードはnullの結果を返すことです。このバージョンを変更するのも難しいことではありませんが、その場合は私の目的のためにnullを返すことに完全に満足しています。
c# - タスク並列ライブラリ - カスタム タスク スケジューラ
Web サービス リクエストをオンライン API に送信する必要があり、Parallel Extensions が私のニーズに適していると考えました。
問題の Web サービスは繰り返し呼び出されるように設計されていますが、1 秒間に一定の呼び出し回数を超えると料金が発生する仕組みになっています。私は明らかに料金を最小限に抑えたいと考えているため、次の要件に対応できる TaskScheduler を見た人がいるかどうか疑問に思っていました。
- タイムスパンごとにスケジュールされるタスクの数を制限します。リクエストの数がこの制限を超えた場合、タスクを破棄するか、ブロックする必要があると思いますか? (タスクのバックログを停止するため)
- 同じリクエストがスケジューラに既に実行されていて、まだ実行されていないかどうかを検出し、そうである場合は 2 番目のタスクをキューに入れず、代わりに最初のタスクを返します。
これらはタスク スケジューラが対処すべき責任の種類であると人々は感じているのでしょうか、それとも私が間違ったツリーを吠えているのでしょうか? 代替案がある場合は、提案を受け付けています。
c# - C# でスレッド ID を取得する方法
上記のコードでは、AsParallel().Any() を使用しています。その AsParallel.Any() によって生成されたスレッドのスレッド ID を取得するにはどうすればよいですか?