Il mio problema riguarda le prestazioni di copia dei file. Abbiamo un sistema di gestione dei media che richiede molti file in movimento sul file system in diverse posizioni, comprese le condivisioni Windows sulla stessa rete, siti FTP, AmazonS3, ecc. Quando eravamo tutti su una rete Windows, potevamo farcela usando System.IO.File.Copy (origine, destinazione) per copiare un file. Dal momento che molte volte abbiamo un input Stream (come un MemoryStream), abbiamo provato ad astrarre l'operazione Copy per prendere un input Stream e un flusso di output, ma stiamo assistendo a una massiccia diminuzione delle prestazioni. Di seguito è riportato un codice per copiare un file da utilizzare come punto di discussione.File.Copy vs. Manual FileStream.Write per copiare file
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();
}
}
}
Qualcuno sa perché questo esegue in modo molto più lento di File.Copy? C'è qualcosa che posso fare per migliorare le prestazioni? Devo solo inserire una logica speciale per vedere se sto copiando da una posizione Windows a un'altra - nel qual caso userò semplicemente File.Copy e negli altri casi userò i flussi?
Per favore fatemi sapere cosa ne pensate e se avete bisogno di ulteriori informazioni. Ho provato diverse dimensioni del buffer e sembra che una dimensione del buffer di 64k sia ottimale per i nostri file "piccoli" e 256k + è una dimensione del buffer migliore per i nostri file "grandi" - ma in entrambi i casi ha prestazioni molto peggiori di File.Copy (). Grazie in anticipo!
Questo potrebbe avere qualcosa a che fare con l'interoperabilità nativa. Il mio sospetto è che File.Copy() e le operazioni di flusso di I/O siano costruite sopra l'API di Windows e che il flusso di chiamata lettura/scrittura ripetutamente in un ciclo sia più costoso rispetto a una chiamata nativa di file di copia che File.Copy() farà. –
@Steve: hai ragione, vedi la mia risposta. –