- - PR -
CPUの制御について
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-14 14:13
現在ASP.NET(VB.NET)にてWEB開発を行っていて、
ある帳票ツールを使っているのですが、大量データで 帳票プログラムを実行すると30〜60分程掛かり その間CPUが常に100%近くになっており、他のプログラム が動かない状態になっています。 帳票ツールを製造会社に問い合わせしたところ 「Thread形式で作成されているコントロールなので CPUを占有してしまうもの」との回答を頂き 回避方法として1頁出力ごとに「一時的にOS側に処理を返す処理」を 加えて下さいと言われて、VBだと「ピーク?(peek?)」という 関数がありますと言われました。 ところが、このピークという関数がVB6でもVB.NETでも見つかりません。 ネット上で調べたところDoEventsとSleepの組み合わせで同現象を回避出来る とも書いてありました。 ここで、 @VBで「ピーク?(peek?)」という関数はあるのでしょうか? A「DoEventsとSleepの組み合わせ」という方法以外で回避方法はないでしょうか? Bその他気付いた点 など、どなたかご教授頂けないでしょうか? よろしくお願いします。 | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 14:41
変な回答ですね。「Thread形式」という意味が分からない。もう一つスレッドを起動して処理を行っているんでしょうけど、CPU を占有する事なんてないでしょう。(意図的にスレッドのプライオリティをかなり上げてもいない限り) 大量のデータを処理し続けているんですから、CPU は限界まで頑張りつづけるのは自明かと思います。CPU 使用率が 100% なのは、問題の帳票ツールや他たくさんのプロセスの仕事の合計ですよね。
は、恐らく休み休み仕事をしろという事なんでしょうけど、「一時的にOS側に処理を返す」というのが、また意味が分からないですね。しつこいですが、一つのスレッドが我が物顔で OS を独占する事はありません。つまり、「一時的にOS側に処理を返す」なんてしなくても、もちろん OS には処理の順番が周ってきます。 帳票ツールの製造会社の方は、わざとそういう言い回しをしているのか、あるいは何も考えていないのか分かりませんが、質問者としては分かり辛かったでしょう。 ASP.NET という事なので、問題は「大量のデータを処理する事」にあるのでしょう。 例えば、その「大量のデータ」を 帳票に全て貼り付けて一気にクライアントに送信したら、それだけで多くの時間がかかるでしょう。 大量のデータを処理しない、効率的なロジックを考えてください。仕様上無理ですか? _________________ 囚人のジレンマな日々 | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 14:59
ありません。
GUI が介在しないなら、DoEvents は必要ありません。 例えば for (int i = 0; i < 10000; i++) { // 重たい処理 #1 System.Threading.Thread.Sleep (0); // 重たい処理 #2 System.Threading.Thread.Sleep (0); } とすることで、CPU の占有率を低下させることが出来ます。 が、その分本来の処理が完了するまでの時間は長くなります。
丸付き数字は使わないでください。 見えない人や、最悪の場合閲覧環境にダメージを受ける人がいます。 [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-01-14 15:10 ] | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 15:36
大量データという抽象的な表現はやめて、カラムと件数を教えてください。 表計算なども絡むのであれば、それも教えてください。
その帳票ツールの名前を教えてください。
これは、あさっての方向の回答ですね。 フツーの帳票ツールであれば、非同期でデータを展開します。 大量データであっても、こんな事態にはなりません。 (もちろん、ページ表示時には同期を取ります) 少なくともこれで、CrystalReports、ActiveReports、VS-VIEW ではないということが判明ですね。 この 3 製品は、そんな間の抜けた実装はなされていません。
Sleep の聞き間違いでしょうか? Stream 〜 であれば Peek メソッドはありますが、今回とは無関係ですね。
他の帳票ツールを使うと根本的な解決ができます。
プライベート メッセージでも良いので、その帳票ツールの名前が知りたいです。 個人的に興味があるので、知りたいです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 15:48
それで何か問題が? WindowsはプリエンティブマルチタスクOSです。不用意にプライオリティを上げたりしない限り、他のアプリケーションが動作しないということはありません。もちろんCPU利用率が低い状態≒CPUリソースに余裕がある状態に比べれば重く感じるでしょうけど…。 仮にあなたが望むようにCPU使用率を下げたとしましょう。それは30秒で終わる処理を、あえて60秒かけて行いたいといっている分けですよ。あえて処理を遅くする事が ユーザーにメリットがあると思います? 他のプロセスが帳票出力処理よりも優先して動作することを望んでいるなら、プロセスの実行プライオリティを下げるのが有効でしょう。これなら不必要に処理が遅くなることも無いはずです。 [ メッセージ編集済み 編集者: 甕星 編集日時 2006-01-14 15:50 ] | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 16:37
みなさん ご教授ありがとうございます。
囚人さん CPUは、他の処理が動いていない約0%の状態で実行したので この帳票プログラムしか動いていない状態ですので、 このプログラムだけで100%使用しています。 渋木宏明さん http://72.14.203.104/search?q=cache:vpHHTid7bfgJ:www.bcap.co.jp/hanafusa/dotnet/day01.htm+vb.net+cpu+100%25&hl=ja 上記のページを参照したのですが…。内容はいかがでしょう? じゃんぬねっとさん 大量データとは、10カラムで60000件ぐらいです。 ページ数で言うと2500ページぐらいです。 製造元の方からSleepではなく「ピーク」だとお聞きしました。 「ピーク」ではなにも見つからないので、やはり聞き間違いでしょう!? 帳票ツールについては、既に本稼動後で今後も問い合わせで お世話になりそうなので、ここへの書き込みは控えます。 プライベート メッセージとは何でしょう?? [ メッセージ編集済み 編集者: ゆうか 編集日時 2006-01-14 16:40 ] | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 17:09
帳票側が非同期に対応していない限りはどうしようもないですね。 Start〜 End〜 を地道に使うことで回避はできそうですが、 Web アプリケーションなので、100% になるのを防ぐ程度ですね。
その Report 自体に定義されたメソッドで存在するとか...
プライベート メッセージ (PM) ありがとうございました。(*_ _) 昔、1 度だけ使ったことがありますね。(旧 VB ですが) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||
|
投稿日時: 2006-01-14 17:18
たぶん PeekMessage のことでしょう。 http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_peekmessage.asp いわゆるメッセージループのことで、VB だと DoEvents に相当します。 |