現在バックグラウンドでファイルアクセスを行うプログラムを組んでおります。
しかしこの読み込みのスレッドのCPU占有率が高いためか、バックグラウンドで
読み込んでいるのに関らず、その他の処理が重くなってしまいます。
この問題を解決しようとファイルアクセスの合間にSleepを挟みましたが
一度にファイルアクセスしている時間が長いためかあまり効果が目に見えません。
できたら平均的に負荷がかかるようにしたいのです。
何か解決方法はないでしょうか?
今考えていることは次の二つ(三つ)です。
1.ファイルアクセスを分割して負荷を下げる。
2.何らかの方法でスレッドの優先順位を下げる。
(3.ファイルアクセス自体の負荷を下げる???)
1が一番現実的かと思っています。
2の方法はプロセスの優先度を下げるソフトを目にしたことがあったので
思いついたのですが、そのような関数が今のところ見当たりません。
3は、そういうものがあるのだろうか?というレベルです。
もしあったら積極的に使いたいと思います。
できたら2の方法で解決したいと思っております。
これに関して何かご存知の方がいらっしゃいましたら、ご教授よろしくお願いします。
VC9+XP sp3にてプログラミングを行っております。
No.1ベストアンサー
- 回答日時:
どんなにあがいてもアクセス時間がゼロになることはありませんが、
チューニングするならば、「正しく原因を特定してから」にしないと無駄骨になります。
(「処理時間の8割は処理の2割が使う」等といわれますが、この2割を見直さないと効果が出ません)
もしタスクマネージャなどで判断しようとしているなら?、
まずちゃんと、プロファイリングしてみた方がいいと思います。
例えば、優先度を下げれば他の処理があればそちらを優先しますが、
逆に言えば他の処理が行われない間はそのスレッドの処理が続きます。
一方、無理矢理Sleepすれば見た目のCPU処理時間は減りますが、
空き時間が増え完了に時間がかかりますから、この点では効率よくありません。
> 2.何らかの方法でスレッドの優先順位を下げる。
APIは以下です。「優先度」がどういうものか、MSDN等でよく調べてから使ってください。
・SetThreadPriority
・SetPriorityClass
> (3.ファイルアクセス自体の負荷を下げる???)
CPUよりメモリの方が影響してる可能性もあると思います。
少なくとも、「アクセス頻度」「アクセス量」が減ることは意味がありますから、
データ構造を見直して/アルゴリズムを変えてサイズを減らすとか、
アクセス頻度を落とすとかを考えるのはいいことだと思います。
> 現在バックグラウンドでファイルアクセスを行うプログラムを組んでおります。
前提としては「別スレッドで」という理解でよいですか。
状況が分からないため確認ですが、「その他の処理」が自分のアプリのことなら、
メッセージ処理を阻害するような(※)実装で遅くなってたりしませんか。
※メッセージの応答を即座に返さないとか、長いループしてるとか…。
> この問題を解決しようとファイルアクセスの合間にSleepを挟みましたが
ファイルアクセスとその他の処理を同じスレッドで実施していたら
Sleepでその他の処理も中断されますから、
Sleepを入れたのはファイルアクセス用のスレッドということでよいですか?
この回答への補足
>前提としては「別スレッドで」という理解でよいですか。
>状況が分からないため確認ですが、「その他の処理」が自分のアプリのことなら、
>メッセージ処理を阻害するような(※)実装で遅くなってたりしませんか。
>※メッセージの応答を即座に返さないとか、長いループしてるとか…。
まずファイルアクセスは別スレッドになります。
また、メッセージ処理など本スレッドとの関り合いも一切ありません。
(やっているつもりは無いのですが、今一度確認してみようと思います。)
>Sleepを入れたのはファイルアクセス用のスレッドということでよいですか?
はい。Sleepを入れているのは、ファイルアクセス用のスレッドです。
返答ありがとうございます。
まずは、SetThreadPriority、SetPriorityClassを使ってみますね。
(そのままの名前ですね。調査不足でした。すいません。)
No.2
- 回答日時:
単に遅くなっても良いのなら、ファイルを細かい単位で分割読みしてSleepを入れればCPU負荷は確実に下がります。
sleepを入れる場合は最低限十数ミリ秒は入れないと効果が出ないと思いますのでかなり遅くなります。そういう意味ではアクセスを減らす工夫、アルゴリズムの見直しが出来るなら見直したほうが良いと思います。
あと、ファイルのオープンは遅いのでファイル数が異常に多い場合は扱うファイル数を減らす工夫が有効です。
この回答への補足
>ファイルを細かい単位で分割読みしてSleepを入れればCPU負荷は
>確実に下がります。sleepを入れる場合は最低限十数ミリ秒は入れない
>と効果が出ないと思いますのでかなり遅くなります。
アドバイスありがとうございます。
やはりそうする方法が一番シンプルですよね。
ただ アクセスしている⇔してない の切り替えで本スレッドが
急に軽くなったり重くなったりするのは問題だったので今回は
その方法の採用を見送りました。
>あと、ファイルのオープンは遅いのでファイル数が異常に多い場合は
>扱うファイル数を減らす工夫が有効です。
質問文には書いていなかったのですが、複数のファイルを一つの大きい
ファイルにアーカイブしたものに対して仮想的に一つ一つのファイルに
アクセスしているような状態です。のでファイルオープン自体はかなり
少ないです。
報告ですが、#1さんが教えてくださいましたスレッド自体の優先度を
下げる方法で、とりあえず気にならないレベルにまで落ち着きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ドライブ・ストレージ 家庭用のNASについて 2 2022/07/05 18:30
- その他(開発・運用・管理) 【至急】.htaccessによるディレクトリ単位でのリダイレクト 2 2023/08/10 13:46
- フリーソフト イーファンビューでwebpファイルが開けません 1 2022/07/12 07:07
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 引越し・部屋探し 引っ越しのコツを教えて下さい 3 2023/01/09 00:01
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
大きいサイズのテキストファイ...
-
ファイル名の先頭にアンダース...
-
バッチで118項目のCSVを処理し...
-
csvファイルを開かずに文字を検...
-
壁紙変更について
-
WORDが直接開けない
-
テキストファイルの最終行を削...
-
CSVファイルへの保存の際、デー...
-
Cでのネットワークファイルの読...
-
「VBScript」ADODB.Streamにお...
-
Access2010の最適化設定について
-
SGファイルって何ですか?
-
フローチャート (ファイル併合...
-
ファイルの結合
-
フリーソフトウェアでflaファイ...
-
VBに、Cのincludeのようなもの...
-
VB.NETによるプロセス間通信
-
グローバル変数のよくない使い...
-
iniファイルをexeファイルと同...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
大きいサイズのテキストファイ...
-
テキストファイルの最終行を削...
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
CSVファイルへの保存の際、デー...
-
グローバル変数のよくない使い...
-
C言語のfopenについて教えてく...
-
SGファイルって何ですか?
-
VBに、Cのincludeのようなもの...
-
ファイルの結合
-
fopenできる上限の変更
-
「VBScript」ADODB.Streamにお...
-
iniファイルに追記がしたいです。
-
XMLファイルの表示について
-
Excelマクロでの再読込み方法
-
VBAにてEXCEL以外のファイル(テ...
おすすめ情報