
¿Hay alguna manera de limitar la velocidad a la que un programa puede leer archivos sin ralentizar el programa?
Respuesta1
En Windows Vista y superior, puede configurar la prioridad de E/S de un proceso. Esto no limitará la velocidad, pero dará prioridad a otros procesos sobre el suyo y les permitirá tener prioridad. Hay API ocultas para hacerlo, pero parece que lo que buscas es una herramienta. Cuando establece la prioridad del proceso, utilizando el administrador de tareas, en Por debajo de lo normal o Inactivo, la prioridad de E/S también disminuye.
Esta pregunta sobre suepruser tiene más información:
¿Cómo cambiar la prioridad de E/S de un proceso o subproceso en Win7?
También enlaza con este proyecto que le permite establecer la prioridad de E/S.
Respuesta2
No estoy seguro acerca del hardware o las soluciones específicas del sistema operativo... Pero salta a la vista lo obvio (perdón por la implementación tosca):
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;
}
Esto sólo es relevante si estás leyendo fragmentos. Supongo que podrías derivar de la secuencia y sobrecargar los métodos relevantes. Empieza a ponerse un poco asqueroso. Pero es una solución sencilla y rápida si no puedes encontrar una solución de nivel inferior.