Mi problema está en lo que respecta al rendimiento de copia de archivos. Tenemos un sistema de administración de medios que requiere mover muchos archivos en el sistema de archivos a diferentes ubicaciones, incluidos los recursos compartidos de Windows en la misma red, sitios FTP, AmazonS3, etc. Cuando todos estábamos en una red de Windows, podíamos salirnos usando System.IO.File.Copy (origen, destino) para copiar un archivo. Dado que muchas veces todo lo que tenemos es un flujo de entrada (como un MemoryStream), tratamos de abstraer la operación de copia para tomar un flujo de entrada y un flujo de salida, pero estamos viendo una disminución masiva de rendimiento. A continuación se muestra un código para copiar un archivo para usar como punto de discusión.File.Copy vs. FileStream.Write manual para copiar el archivo
public void Copy(System.IO.Stream inStream, string outputFilePath)
{
int bufferSize = 1024 * 64;
using (FileStream fileStream = new FileStream(outputFilePath, FileMode.OpenOrCreate, FileAccess.Write))
{
int bytesRead = -1;
byte[] bytes = new byte[bufferSize];
while ((bytesRead = inStream.Read(bytes, 0, bufferSize)) > 0)
{
fileStream.Write(bytes, 0, bytesRead);
fileStream.Flush();
}
}
}
¿Alguien sabe por qué esto funciona mucho más lento que File.Copy? ¿Hay algo que pueda hacer para mejorar el rendimiento? ¿Voy a tener que poner una lógica especial para ver si estoy copiando de una ubicación de Windows a otra, en cuyo caso solo usaría File.Copy y en los otros casos usaré las transmisiones?
Háganme saber lo que piensa y si necesita información adicional. He probado diferentes tamaños de buffer y parece que un tamaño de buffer de 64k es óptimo para nuestros archivos "pequeños" y 256k + es un mejor tamaño de buffer para nuestros archivos "grandes", pero en cualquier caso funciona mucho peor que File.Copy () ¡Gracias por adelantado!
Esto podría tener algo que ver con interoperabilidad nativa. Mi sospecha es que File.Copy() y las operaciones de IO de flujo se construyen sobre la API de Windows, y que la secuencia de lectura de lectura/escritura repetidamente en un bucle es más costosa que una llamada de archivo de copia nativa que File.Copy() hará. –
@Steve: Tiene razón, vea mi respuesta. –