File.Copy vs. Manual FileStream.Write Do kopiowania pliku

Mój problem dotyczy wydajności kopiowania plików. Mamy system zarządzania multimediami, który wymaga wielu plików w systemie plików do różnych lokalizacji, w tym udziałów Windows w tej samej sieci, witryn FTP, AmazonS3 itp. Gdy byliśmy w jednej sieci Windows, mogliśmy uciec System.IO.File.Copy (źródło, miejsce docelowe), aby skopiować plik. Ponieważ wiele razy mamy tylko strumień wejściowy (taki jak MemoryStream), próbowaliśmy wyodrębnić operację kopiowania, aby uzyskać strumień wejściowy i strumień wyjściowy, ale widzimy ogromny spadek wydajności. Poniżej znajduje się kod do kopiowania pliku do wykorzystania jako punkt do dyskusji.

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();
        }
    }
}

Czy ktoś wie, dlaczego to działa tak wolniej niż File.Copy? Czy jest coś, co mogę zrobić, aby poprawić wydajność? Czy po prostu będę musiał wprowadzić specjalną logikę, aby sprawdzić, czy kopiuję z jednej lokalizacji systemu Windows do innej - w takim przypadku użyłbym po prostu File.Copy, aw innych przypadkach użyję strumieni?

Daj mi znać, co myślisz i czy potrzebujesz dodatkowych informacji. Próbowałem różnych rozmiarów buforów i wygląda na to, że rozmiar bufora 64 kB jest optymalny dla naszych „małych” plików, a 256 k + to lepszy rozmiar bufora dla naszych „dużych” plików - ale w obu przypadkach działa on znacznie gorzej niż File.Copy ( ). Z góry dziękuję!

questionAnswers(8)

yourAnswerToTheQuestion