Я пытаюсь реализовать метод filecopy, который может сопоставить производительность копии, сделанной с помощью проводника Windows.
Например, копия (с помощью проводника Windows) из нашего NAS на мой компьютер, выполняется выше100 МБ / с.
Моя текущая реализация делает ту же копию со скоростью около 55 МБ / с, что уже лучше, чем System.IO.File.Copy (), которая работает со скоростью 29 МБ / с.
static void Main(string[] args)
{
String src = @"";
String dst = @"";
Int32 buffersize = 1024 * 1024;
FileStream input = new FileStream(src, FileMode.Open, FileAccess.Read, FileShare.None, 8, FileOptions.Asynchronous | FileOptions.SequentialScan);
FileStream output = new FileStream(dst, FileMode.CreateNew, FileAccess.Write, FileShare.None, 8, FileOptions.Asynchronous | FileOptions.SequentialScan);
Int32 readsize = -1;
Byte[] readbuffer = new Byte[buffersize];
IAsyncResult asyncread;
Byte[] writebuffer = new Byte[buffersize];
IAsyncResult asyncwrite;
DateTime Start = DateTime.Now;
output.SetLength(input.Length);
readsize = input.Read(readbuffer, 0, readbuffer.Length);
readbuffer = Interlocked.Exchange(ref writebuffer, readbuffer);
while (readsize > 0)
{
asyncwrite = output.BeginWrite(writebuffer, 0, readsize, null, null);
asyncread = input.BeginRead(readbuffer, 0, readbuffer.Length, null, null);
output.EndWrite(asyncwrite);
readsize = input.EndRead(asyncread);
readbuffer = Interlocked.Exchange(ref writebuffer, readbuffer);
}
DateTime Stop = DateTime.Now;
TimeSpan Duration = Stop - Start;
Double speed = input.Length / Duration.TotalSeconds; // bytes/s
System.Console.WriteLine("MY Speed : " + (speed / 1024 / 1024).ToString() + " mo/sec");
input.Close();
output.Close();
System.IO.File.Delete(dst);
}
Есть идеи, как повысить производительность?
РЕДАКТИРОВАТЬ:
Файл читается из NAS на основе Linux с интерфейсом 10 Gigabit Ethernet с 60 дисков позади (неНе беспокойтесь о его производительности, он работает очень хорошо) и записывается в локальный raid0, который может записывать данные со скоростью около 140 МБ / с.
Узким местом является гигабитный сетевой интерфейс назначения, которого я не могу достичь с помощью моеготекущий код.
Кроме того, удаление записи не сделает чтение более быстрым, поэтому я не могу превысить этот предел чтения 55 МБ / с.
РЕДАКТИРОВАТЬ 2:
Скорость выдачиЭто связано с тем, что исходный файл хранится в общей сетевой папке.Только чтение с моего локального диска с моим фрагментом кода дает мне скорость 112 МБ / с.
РЕДАКТИРОВАТЬ 3:
Samba, похоже, не проблема.Я заменил общий ресурс cifs (samba) на общий ресурс nfs на моем linux nas и получил худшие результаты, чем samba на моем клиенте win7.
С nfs мой метод копирования и проводник Windows имели одинаковую производительность, примерно42 МБ / с.
У меня нет идей ...
РЕДАКТИРОВАТЬ 4:
Просто чтобы быть уверенным, что проблема была в Windows, я установил debian lenny, смонтировал nas через nfs и получил 79 МБ / с с тем же кодом под моно.