[過去ログ]
ふらっと C#,C♯,C#(初心者用) Part138 (1002レス)
ふらっと C#,C♯,C#(初心者用) Part138 http://mevius.5ch.net/test/read.cgi/tech/1528194762/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
799: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 00:13:38.17 ID:IU6x2eOV0 >>798 > データグリッドビューは進捗状況を見るために更新していて > 1行1スレッドで処理されて処理後にどう処理されたかをリアルタイム表示してます 進捗状況の確認が必要なほど1行あたりの処理に時間がかかる理由は何でしょうか? もしその理由が IO など、CPU 以外のところにあるのだとすれば、 Parallel.ForEach を使うこと自体を見直したほうがいいかもしれません > この処理ならlocalFinallyが最適かもです 正直なところ、更新処理だけ切り出す方法よりも localFinally の方が 適切なケースはまれだと思います ただ、localFinally の使い方がわかれば更新処理を Parallel.ForEach の外に 切り出す方法もわかると思うので、とりあえず調べてみて損はないと思います http://mevius.5ch.net/test/read.cgi/tech/1528194762/799
801: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 00:35:58.51 ID:IU6x2eOV0 >>800 なるほど〜 CPU 処理も IO もあって微妙なところですね ちなみにその外部ツールはマルチスレッドを使うオプションはないでしょうか? (例えば 7-zip.exe だと -mmt がそれにあたります) もし外部ツールがマルチスレッドに対応してるなら、 並列処理はそっちに任せてしまうというのはどうでしょう? または、外部ツールではなく SharpCompress のようなライブラリを使うことができれば、 C# によるより細かい制御も可能になると思います http://mevius.5ch.net/test/read.cgi/tech/1528194762/801
803: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 00:45:55.06 ID:IU6x2eOV0 >>800 それともう一つ、外部ツールを呼び出すのにデフォルトの ParallelOptions で Parallel.ForEach を呼び出すのはさすがにまずいと思います ParallelOptions 自体に MaxDegreeOfParallelism というプロパティがありますし、 ParallelOptions の TaskScheduler プロパティに以下のような自前のスケジューラーを 設定すればより柔軟な並列処理を実現できると思います 同時実行の程度を制限するタスク スケジューラを作成する https://msdn.microsoft.com/ja-jp/library/ee789351(v=vs.100).aspx >>802 それは確かにw 完成したソフトによって得られる利益よりソフトを作るコストのほうが大きくなってしまったら 意味がないですからね (ただしソフトによって得られる利益には開発者のスキルアップも含まれる・・・と言ってみたりw) http://mevius.5ch.net/test/read.cgi/tech/1528194762/803
806: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 00:54:31.49 ID:IU6x2eOV0 >>804 > mmtは一つの処理をマルチに実行するものではないでしょうか その通りです したいことが「進捗状況を表示できるようにすること」と「並列化により処理時間を短縮すること」 だとすれば、それで問題ない(というかむしろその方が望ましい)の思うのですがいかがでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1528194762/806
807: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 00:59:41.83 ID:IU6x2eOV0 >>805 MaxDegreeOfParallelism を使ってらっしゃるなら とりあえず致命的にまずいことはないと思います ただ、CPU だけじゃなく、同時に8つのファイルの読み書きを 求められる HDD さんの気持ちも考えてあげて・・・w http://mevius.5ch.net/test/read.cgi/tech/1528194762/807
812: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 01:18:41.37 ID:IU6x2eOV0 >>808 Parallel.ForEach を使わなくてもそれはできると思うのですがいかがでしょうか? >>809 確かにおっしゃる通りですね 後は好みの問題ですが、やはり私は1行ごとに Invoke するよりも パフォーマンス的に有利な localFinally や更新処理の切り出しを推したいですw >>811 なるほど!そうすれば外部ツールを使っても HDD へのアクセスだけ別に処理できますね ただ、HDD へのアクセスを別にしようという意識をお持ちで、それだけのスキルもあるのなら、 外部ツールにこだわる必要はないのでは・・・という気もします あと、メモリは HDD よりはずっと速いですが、CPU キャッシュとかの関係でやっぱり 8 個のファイルを同時に読み出すよりは1つずつの方が良いような気がします http://mevius.5ch.net/test/read.cgi/tech/1528194762/812
813: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 01:27:28.49 ID:IU6x2eOV0 >>809 >>812 いや、でも進捗状況を表示するとなると結局どこかで await は使うことになりそうですね ただ私としては >>800 のような処理なら Parallel.ForEach は必要ないと考えていて、 foreach (ファイルのループ) { foreach (進捗状況のループ) { await (進捗状況の更新待ち); (進捗状況を画面に反映); } (1ファイルの完了を画面に反映); } のような感じで十分だと思うのですが、どんなもんでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1528194762/813
818: デフォルトの名無しさん (ワッチョイ 9f5d-haGl) [sage] 2018/07/22(日) 03:07:13.11 ID:IU6x2eOV0 >>815 > そうです、最も投げやすく勝手にマルチしてくれる便利なParallelさんって聞いて使ってるます これは私も同じように認識しています > cpuキャッシュとか考慮せずマルチ=高速って誤認識で走ってきて これは場合によりけりだと思います 特に今回のように外部ツール側でマルチスレッドにできる場合はツールの呼び出し側では 余計なことをせず外部ツールに任せたほうが高速になる場合が多いと思います >>817 C# で並列処理を行うならこれは一つの解決策になりそうですね 別の解決策として、新たに参照を追加する必要のない↓の方法とかどうでしょう? var tasks = new List<Task>(); foreach (var param in zipOpParams) { if (tasks.Count == 8) tasks.Remove(await Task.WhenAny(tasks)); tasks.Add(ExecuteZipOpAsync(param).ContinueWith( _ => InvokeUpdateUi(param), TaskScheduler.FromCurrentSynchronizationContext())); } await Task.WhenAll(tasks); http://mevius.5ch.net/test/read.cgi/tech/1528194762/818
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.036s