現在バックグラウンドでファイルアクセスを行うプログラムを組んでおります。
しかしこの読み込みのスレッドの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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
グローバル変数のよくない使い...
-
ファイル名の先頭にアンダース...
-
WAVファイル同士の結合が可...
-
急にプログラムが正しく動かな...
-
Perlでファイルを読み込む場合...
-
jwsファイルが開けない!
-
unlinkしたファイルを元に戻す...
-
Cでのネットワークファイルの読...
-
fopenできる上限の変更
-
Dreamweaverコードカラーについて
-
FileOpen 関数で既にファイル...
-
javaで例外エラーが発生した際...
-
mmap()を使ったファイルへの書...
-
複数ファイルによる共通の外部...
-
csvファイルを開かずに文字を検...
-
写真の撮影日を取得するには?
-
CSVファイル読み込み
-
分割コンパイルの#defineについて
-
インプットファイル・アウトプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
CSVファイルへの保存の際、デー...
-
SGファイルって何ですか?
-
テキストファイルの最終行を削...
-
Excelマクロでの再読込み方法
-
分割コンパイルの#defineについて
-
大きいサイズのテキストファイ...
-
グローバル変数のよくない使い...
-
ドラッグアンドドロップでファ...
-
VBAにてEXCEL以外のファイル(テ...
-
C言語のfopenについて教えてく...
-
iniファイルに追記がしたいです。
-
バッチで118項目のCSVを処理し...
-
【C#】リソースファイルの埋め...
-
FileOpen 関数で既にファイル...
-
VBに、Cのincludeのようなもの...
-
WAVファイル同士の結合が可...
-
ハッシュの計算時間について
おすすめ情報