Моя проблема связана с производительностью копирования файлов. У нас есть система управления мультимедиа, которая требует много перемещения файлов в файловой системе в разные места, включая общие папки 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 КБ является оптимальным для наших «маленьких» файлов, а 256 Кбайт является лучшим размером буфера для наших «больших» файлов - но в любом случае он работает намного хуже, чем File.Copy ). Заранее спасибо!