
Gibt es eine Möglichkeit, die Geschwindigkeit zu begrenzen, mit der ein Programm Dateien lesen kann, ohne das Programm selbst zu verlangsamen?
Antwort1
Unter Windows Vista und höher können Sie die E/A-Priorität eines Prozesses festlegen. Dadurch wird die Rate nicht begrenzt, aber anderen Prozessen wird Vorrang vor Ihrem Prozess eingeräumt und sie können Vorrang haben. Es gibt versteckte APIs, um dies zu tun, aber anscheinend suchen Sie nach einem Tool. Wenn Sie die Prozesspriorität mithilfe des Task-Managers auf „Unter Normal“ oder „Leerlauf“ festlegen, sinkt auch die E/A-Priorität.
Diese Frage auf supruser enthält weitere Informationen:
Wie ändere ich die E/A-Priorität eines Prozesses oder Threads in Win7?
Es enthält außerdem einen Link zu diesem Projekt, mit dem Sie die E/A-Priorität festlegen können.
Antwort2
Ich bin mir nicht sicher, was hardware- oder betriebssystemspezifische Lösungen angeht … Aber das Offensichtliche fällt sofort auf (verzeihen Sie die grobe Implementierung):
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;
}
Dies ist nur relevant, wenn Sie Blöcke lesen. Ich nehme an, Sie könnten aus dem Stream ableiten und die relevanten Methoden überladen. Das wird langsam ein bisschen eklig. Aber es ist eine einfache und schnelle Problemumgehung, wenn Sie keine Lösung auf niedrigerer Ebene finden können.