- - PR -
aspnet_wp.exeのCPU使用率が100パーセントになってしまいます。
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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を酷使しないで上記のような事を行うことはできますでしょうか。 よろしくお願いします。 | ||||
|
投稿日時: 2005-04-29 03:01
こんにちは中です。
別スレッドにする(優先度を下げる) Sleepを入れながら処理を行う とりあえずASP.NETではしないようにしましょう。 避けて通れないといっても、オンラインでやる必要はなく、バッチや、ディレイドなんてものも検討すべきでしょう。 | ||||
|
投稿日時: 2005-04-29 06:58
一番簡単なのは、スリープをかます。
根本的な対処をしようとすると、各SELECTで取ってきているものと、INSERTやUPDATEで使っているHOGEとの関係がわからないと、無理です。 例えば、本当に千回もループする必要があるのか、3回のSELECTを1つにまとめることができないか、INSERT1回で済むんじゃないか?DataTableとDataAdapterを使えばいいんじゃないか、etc... _________________ | ||||
|
投稿日時: 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秒くらいで処理が終わるようになりました。 また今後も質問などさせていただく機会があるかとおもいますがよろしくお願いいたします。 | ||||
|
投稿日時: 2005-04-30 09:51
まずは、解決して何よりです。 処理の時間を短縮したいときは、実際に、どの処理にどれくらいの時間がかかっているのか計ることが大事です。けれどもその前に、どのような処理が時間がかかるか知っておくことも必要です。ただ、これに頼りすぎて計測しないと、実際と頭とがずれて、いつまでも解決しないことがあります。 _________________ | ||||
|
投稿日時: 2005-04-30 10:05
そうですね。 私は初め、固定観念でクエリーで重い処理はinsert、updateだろうと思って、 そこの部分をコメントアウトして実行してみましたが、実行速度は、 殆どかわらなかったので根本的クエリーの中で軽い処理だとおもっていたSELECT文も ループで回すと重い処理に変わってしまうことが分かりました。 | ||||
|
投稿日時: 2005-05-01 06:35
う〜ん、ちょっと違うと思う。 INSERTは、軽いですよ。インデックスがついていなければ。逆に、インデックスがついていないSELECTやUPDATEは重いです。 また、私が質問を読んで考えたのは、データベースへのアクセスです。頻繁にアクセスするのは、重くなります。アクセスする、という処理が重いのです。それが、『3回のSELECTを1つにまとめることができないか、INSERT1回で済むんじゃないか?』と書いた理由です。 _________________ |
1