- PR -

CPUの制御について

投稿者投稿内容
ゆうか
ベテラン
会議室デビュー日: 2004/04/01
投稿数: 62
投稿日時: 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その他気付いた点
など、どなたかご教授頂けないでしょうか?
よろしくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-14 14:41
引用:

「Thread形式で作成されているコントロールなので
CPUを占有してしまうもの」


変な回答ですね。「Thread形式」という意味が分からない。もう一つスレッドを起動して処理を行っているんでしょうけど、CPU を占有する事なんてないでしょう。(意図的にスレッドのプライオリティをかなり上げてもいない限り)

大量のデータを処理し続けているんですから、CPU は限界まで頑張りつづけるのは自明かと思います。CPU 使用率が 100% なのは、問題の帳票ツールや他たくさんのプロセスの仕事の合計ですよね。

引用:

「一時的にOS側に処理を返す処理」


は、恐らく休み休み仕事をしろという事なんでしょうけど、「一時的にOS側に処理を返す」というのが、また意味が分からないですね。しつこいですが、一つのスレッドが我が物顔で OS を独占する事はありません。つまり、「一時的にOS側に処理を返す」なんてしなくても、もちろん OS には処理の順番が周ってきます。

帳票ツールの製造会社の方は、わざとそういう言い回しをしているのか、あるいは何も考えていないのか分かりませんが、質問者としては分かり辛かったでしょう。

ASP.NET という事なので、問題は「大量のデータを処理する事」にあるのでしょう。
例えば、その「大量のデータ」を 帳票に全て貼り付けて一気にクライアントに送信したら、それだけで多くの時間がかかるでしょう。
大量のデータを処理しない、効率的なロジックを考えてください。仕様上無理ですか?

_________________
囚人のジレンマな日々
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-14 14:59
引用:

(1)VBで「ピーク?(peek?)」という関数はあるのでしょうか?



ありません。

引用:

(3)DoEventsとSleepの組み合わせ」という方法以外で回避方法はないでしょうか?



GUI が介在しないなら、DoEvents は必要ありません。

例えば

for (int i = 0; i < 10000; i++)
{
// 重たい処理 #1

System.Threading.Thread.Sleep (0);

// 重たい処理 #2

System.Threading.Thread.Sleep (0);
}

とすることで、CPU の占有率を低下させることが出来ます。

が、その分本来の処理が完了するまでの時間は長くなります。

引用:

(3)その他気付いた点



丸付き数字は使わないでください。
見えない人や、最悪の場合閲覧環境にダメージを受ける人がいます。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-01-14 15:10 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-14 15:36
引用:

ゆうかさんの書き込み (2006-01-14 14:13) より:

ある帳票ツールを使っているのですが、大量データで
帳票プログラムを実行すると30〜60分程掛かり


大量データという抽象的な表現はやめて、カラムと件数を教えてください。
表計算なども絡むのであれば、それも教えてください。

引用:

帳票ツールを製造会社に問い合わせしたところ


その帳票ツールの名前を教えてください。

引用:

「Thread形式で作成されているコントロールなので
CPUを占有してしまうもの」との回答を頂き


これは、あさっての方向の回答ですね。
フツーの帳票ツールであれば、非同期でデータを展開します。
大量データであっても、こんな事態にはなりません。
(もちろん、ページ表示時には同期を取ります)

少なくともこれで、CrystalReports、ActiveReports、VS-VIEW ではないということが判明ですね。
この 3 製品は、そんな間の抜けた実装はなされていません。

引用:

(1) VBで「ピーク?(peek?)」という関数はあるのでしょうか?


Sleep の聞き間違いでしょうか?
Stream 〜 であれば Peek メソッドはありますが、今回とは無関係ですね。

引用:

(2)「DoEventsとSleepの組み合わせ」という方法以外で回避方法はないでしょうか?


他の帳票ツールを使うと根本的な解決ができます。

引用:

(3) その他気付いた点


プライベート メッセージでも良いので、その帳票ツールの名前が知りたいです。
個人的に興味があるので、知りたいです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-01-14 15:48
引用:

ゆうかさんの書き込み (2006-01-14 14:13) より:
その間CPUが常に100%近くになっており、他のプログラム
が動かない状態になっています。


それで何か問題が?
WindowsはプリエンティブマルチタスクOSです。不用意にプライオリティを上げたりしない限り、他のアプリケーションが動作しないということはありません。もちろんCPU利用率が低い状態≒CPUリソースに余裕がある状態に比べれば重く感じるでしょうけど…。
仮にあなたが望むようにCPU使用率を下げたとしましょう。それは30秒で終わる処理を、あえて60秒かけて行いたいといっている分けですよ。あえて処理を遅くする事が
ユーザーにメリットがあると思います?

他のプロセスが帳票出力処理よりも優先して動作することを望んでいるなら、プロセスの実行プライオリティを下げるのが有効でしょう。これなら不必要に処理が遅くなることも無いはずです。


[ メッセージ編集済み 編集者: 甕星 編集日時 2006-01-14 15:50 ]
ゆうか
ベテラン
会議室デビュー日: 2004/04/01
投稿数: 62
投稿日時: 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 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-14 17:09
引用:

ゆうかさんの書き込み (2006-01-14 16:37) より:

大量データとは、10カラムで60000件ぐらいです。
ページ数で言うと2500ページぐらいです。


帳票側が非同期に対応していない限りはどうしようもないですね。
Start〜 End〜 を地道に使うことで回避はできそうですが、
Web アプリケーションなので、100% になるのを防ぐ程度ですね。

引用:

製造元の方からSleepではなく「ピーク」だとお聞きしました。
「ピーク」ではなにも見つからないので、やはり聞き間違いでしょう!?


その Report 自体に定義されたメソッドで存在するとか...

引用:

帳票ツールについては、既に本稼動後で今後も問い合わせで
お世話になりそうなので、ここへの書き込みは控えます。
プライベート メッセージとは何でしょう??


プライベート メッセージ (PM) ありがとうございました。(*_ _)
昔、1 度だけ使ったことがありますね。(旧 VB ですが)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-01-14 17:18
引用:

ゆうかさんの書き込み (2006-01-14 14:13) より:
ところが、このピークという関数がVB6でもVB.NETでも見つかりません。
ネット上で調べたところDoEventsとSleepの組み合わせで同現象を回避出来る
とも書いてありました。


たぶん PeekMessage のことでしょう。
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_peekmessage.asp
いわゆるメッセージループのことで、VB だと DoEvents に相当します。

スキルアップ/キャリアアップ(JOB@IT)