Моя проблема связана с производительностью копирования файлов. У нас есть система управления мультимедиа, которая требует много движущихся файлов в файловой системе в разных местах, включая общие ресурсы Windows в одной сети, FTP-сайтах, AmazonS3 и т.д. Когда мы были в одной сети Windows, мы могли бы избежать использования System.IO.File.Copy(источник, получатель) для копирования файла. Поскольку во многих случаях у нас есть входной поток (например, MemoryStream), мы попытались абстрагировать операцию копирования, чтобы принять входной поток и выходной поток, но мы наблюдаем значительное снижение производительности. Ниже приведен код для копирования файла для использования в качестве точки обсуждения.
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();
}
}
}
Кто-нибудь знает, почему это работает намного медленнее, чем File.Copy? Есть ли что-то, что я могу сделать для повышения производительности? Мне просто нужно будет ввести специальную логику, чтобы посмотреть, копирую ли я из одного окна в другое, и в этом случае я бы просто использовал File.Copy, а в других случаях я буду использовать потоки?
Пожалуйста, дайте мне знать, что вы думаете и нужна ли вам дополнительная информация. Я пробовал разные размеры буфера, и кажется, что размер буфера размером 64 КБ оптимален для наших "маленьких" файлов, а 256k + - лучший размер буфера для наших "больших" файлов, но в любом случае он намного хуже, чем File.Copy(). Заранее спасибо!