@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

aspnet_wp.exeのCPU使用率が100パーセントになってしまいます。

1
投稿者投稿内容
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2005-04-28 14:31
はじめて投稿させていただきます。
みなさんのお知恵を拝借できればと思います。

現在アプリケーションを改善しようとしているところなのですが、
ACCESSからデーターを参照しつつ登録・更新する×1000回の反復作業で
タイトルの通りaspnet_wp.exeのCPU使用率が100パーセントになって
しまう現象に困っております。実際にエラーが出ているわけでは
ないのですが、現在ローカルでテスト中ですが、サーバーに上げた際に、
そのほかの.NETアプリケーションが使用不可能な状態になると思われます。

自分自身負荷が高い処理を行っているのは分かってはいるのですが、
避けては通れない機能なのです。
間単にどういったDB処理を行いたいかといいますと、

for(i=0;i<1000;i++){
//DBの値の参照
SELECT total FROM mytable

SELECT total FROM mytable2

SELECT total FROM mytable3

INSERT INTO mytable4(hoge1, hoge2, mhoge3) VALUES(....

UPDATE mytable5 set hoge1=hoge....

}

上記のような処理を繰返し行いたいのです。
このループ処理の間、CPUの使用率が100パーセントになってしまいます。
CPUを酷使しないで上記のような事を行うことはできますでしょうか。

よろしくお願いします。

中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2005-04-29 03:01
こんにちは中です。

別スレッドにする(優先度を下げる)
Sleepを入れながら処理を行う

とりあえずASP.NETではしないようにしましょう。

避けて通れないといっても、オンラインでやる必要はなく、バッチや、ディレイドなんてものも検討すべきでしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-29 06:58
 一番簡単なのは、スリープをかます。

 根本的な対処をしようとすると、各SELECTで取ってきているものと、INSERTやUPDATEで使っているHOGEとの関係がわからないと、無理です。
 例えば、本当に千回もループする必要があるのか、3回のSELECTを1つにまとめることができないか、INSERT1回で済むんじゃないか?DataTableとDataAdapterを使えばいいんじゃないか、etc...

_________________
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2005-04-30 09:14
中博俊さん、Jittaさん
返信ありがとうございます。

こちらの件ですが、その後、自分なりにいろいろ方法を考えて、
最終定期に、DataTable,DataAdapterを使うことで、一連の処理を
かなり効率的に行うことができるようになりました。
DataTable,DataAdapter等、ふだん何気なくしようしており、DataAdapter
を使って、追加、更新、削除を行えるのは知っていたのですが、
件数が多い場合このように、効果的にDB処理ができたのでびっくりしました。

ループを回すのは変わっていませんが、
ループを回す以前に、SELECT分の処理を行っていた部分に該当するデーターを
いくつかのdataTable格納し、DataTable.Select()とDatatable.Rows.Find()メソッドを使用し、対象となるレコードを抽出、データーの集計、
DataTable.Ros.Addを使用しレコードの追加、ループが終了した時点で、
DatatableをACCESSに戻す。
これが今までクエリー分で行っていた場合、1分くらいでしたが、
5秒くらいで処理が終わるようになりました。

また今後も質問などさせていただく機会があるかとおもいますがよろしくお願いいたします。



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-30 09:51
引用:

newbornさんの書き込み (2005-04-30 09:14) より:

こちらの件ですが、その後、自分なりにいろいろ方法を考えて、
最終定期に、DataTable,DataAdapterを使うことで、一連の処理を
かなり効率的に行うことができるようになりました。


 まずは、解決して何よりです。

 処理の時間を短縮したいときは、実際に、どの処理にどれくらいの時間がかかっているのか計ることが大事です。けれどもその前に、どのような処理が時間がかかるか知っておくことも必要です。ただ、これに頼りすぎて計測しないと、実際と頭とがずれて、いつまでも解決しないことがあります。
_________________
newborn
常連さん
会議室デビュー日: 2005/04/28
投稿数: 34
お住まい・勤務地: JAPAN
投稿日時: 2005-04-30 10:05
引用:
処理の時間を短縮したいときは、実際に、どの処理にどれくらいの時間がかかっているのか計ることが大事です。けれどもその前に、どのような処理が時間がかかるか知っておくことも必要です。ただ、これに頼りすぎて計測しないと、実際と頭とがずれて、いつまでも解決しないことがあります。



そうですね。
私は初め、固定観念でクエリーで重い処理はinsert、updateだろうと思って、
そこの部分をコメントアウトして実行してみましたが、実行速度は、
殆どかわらなかったので根本的クエリーの中で軽い処理だとおもっていたSELECT文も
ループで回すと重い処理に変わってしまうことが分かりました。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-01 06:35
引用:

newbornさんの書き込み (2005-04-30 10:05) より:

私は初め、固定観念でクエリーで重い処理はinsert、updateだろうと思って、
そこの部分をコメントアウトして実行してみましたが、実行速度は、
殆どかわらなかったので根本的クエリーの中で軽い処理だとおもっていたSELECT文も
ループで回すと重い処理に変わってしまうことが分かりました。


 う〜ん、ちょっと違うと思う。
 INSERTは、軽いですよ。インデックスがついていなければ。逆に、インデックスがついていないSELECTやUPDATEは重いです。

 また、私が質問を読んで考えたのは、データベースへのアクセスです。頻繁にアクセスするのは、重くなります。アクセスする、という処理が重いのです。それが、『3回のSELECTを1つにまとめることができないか、INSERT1回で済むんじゃないか?』と書いた理由です。
_________________
1

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