
プログラム自体の速度を低下させることなく、プログラムがファイルから読み取る速度を制限する方法はありますか?
答え1
Windows Vista 以降では、プロセスの I/O 優先度を設定できます。これによりレートは制限されませんが、他のプロセスが自分のプロセスよりも優先され、優先されるようになります。これを行うための隠し API がありますが、探しているのはツールのようです。タスク マネージャーを使用してプロセスの優先度を「通常以下」または「アイドル」に設定すると、I/O 優先度も下がります。
suepruser のこの質問にさらに詳しい情報があります:
Win7 でプロセスまたはスレッドの I/O 優先度を変更するにはどうすればいいですか?
また、I/O 優先度を設定できるこのプロジェクトへのリンクもあります。
答え2
ハードウェアや OS 固有のソリューションについてはよくわかりませんが、明らかなことは明らかです (粗雑な実装をお許しください)。
const long long maxBytesPerSec = 1048576;
static long long bytesRead = 0;
static long long secondsElapsed = 1;
istream & ReadBytesThrottled( istream & s, char * buffer, long long bytesToRead )
{
while( (bytesRead+bytesToRead) / secondsElapsed > maxBytesPerSec ) {
// Wait and update secondsElapsed
}
s.read(buffer, bytesToRead);
if( s.good() ) bytesRead += bytesToRead;
return s;
}
void ResetThrottle()
{
bytesRead = 0;
secondsElapsed = 1;
}
これは、チャンクを読み取っている場合にのみ関係します。ストリームから派生して、関連するメソッドをオーバーロードできると思います。少し嫌な感じになってきました。しかし、低レベルのソリューションが見つからない場合は、これはシンプルで迅速な回避策です。