Anuncios Google

Velocidad del lectura y tamaño de los bloques

Tengo un programa que coge un conjunto de archivos y los "empaqueta" en uno solo.

 

Pues bien, puedo leer y copiar los archivos byte a byte o por bloques. Evidentemente lo segundo es más rápido pero hay una incrongruencia.

Lo  que note es que cuanto más grande sea el bloque más rápido termina. Pero llega un momento para tamaños muyy grandes (por ejemplo 50 MB) que empieza a ir más lento... ¿Cual sería entonces el tamaño ideal? ¿Alguien ha hecho alguna vez la prueba?


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Comandillos

El tamaño

Bueno, el tamaño de los bloques da lo mismo, contra mas pequeño sean mas bloques debera copiar, y contra mas grandes, menos veces copiará logicamente.

Si empieza a ir mas lento cuando llega al final de un archivo grande, lo mas seguro es que estes cargando todo el archivo en la RAM, y luego, lo guardes. Lo suyo sería trabajar con un buffer que los fuera escribiendo para no terminar llenando la RAM.


Lo leo desde un buffer...

Lo leo desde un buffer... Cuando digo bloque también me refiero al tamaño del buffer:

 

 while (Offset < Tamanyo_Archivo)
{
               Offset += Tamanyo_Lectura;
               Lectura.read(Cosa,Tamanyo_Lectura);
               Escritura.write(Cosa,Tamanyo_Lectura);
 
 
               if ((Tamanyo_Archivo - Offset) < Tamanyo_Lectura)
               {
                  Lectura.read(Cosa,Tamanyo_Archivo - Offset);
                  Escritura.write(Cosa,Tamanyo_Archivo- Offset);
                  Offset = Tamanyo_Archivo;
               }
  }

 

Dependiendo del valor que le de a Tamanyo_Lectura, me tarda tiempos diferentes. Algunas veces con diferencias significativas (bloques de 500 kb tardan como un 75% menos que bloques de 10 bytes). La cosa es pillar el punto intermedio perfecto...

Yo lo que hago es algo

Yo lo que hago es algo así:

 

#define BUFFER_SIZE 512
//al copiar
bytesLeidos = fread(BUFFER_SIZE...
fwrite( bytesLeidos...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.