Замедление при копировании огромных (120 + ГБ) файлов - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть приложение на C #, и я использую класс FileStream для чтения файла объемом 120 ГБ из хранилища * EDIT * isilon (сопоставленного с диском z) по гигабитной локальной сети.Я начинаю с скорости чтения 45 мегабайт / с, но примерно в диапазоне 20 ГБ моя скорость чтения резко падает и достигает примерно 9 мегабайт / с.Кто-нибудь имеет какие-либо идеи о том, что может быть причиной замедления?

Сервер - это 64-разрядная ОС Windows Server 2008 Enterprise R2, 16 ГБ ОЗУ, двухъядерный четырехъядерный процессор, а мое приложение - 64-разрядное консольное приложение .NET Framework 4.0,Вот мой код:

        byte[] buffer = new byte[16777216];
        int count;
        long totalBytes = 0;
        FileStream file = File.OpenRead("z:\bigfile.dat");
        while ((count = file.Read(buffer, 0, buffer.Length)) > 0)
        {
            // I track megabyte / second here
            totalBytes += count;
        }

Ответы [ 5 ]

1 голос
/ 08 сентября 2010

Оказывается, я действительно читал по сети. Я думал, что мой подключенный диск был локальным, но это не так. У меня все еще есть проблема при чтении по сети, но когда я теперь на самом деле читаю файл с локального диска, скорость - это то, что я ожидаю. Спасибо всем.

РЕДАКТИРОВАТЬ Я исправил проблему чтения по сети. Вы можете создать FileStream, который не использует кэш Windows с этим кодом:

FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, bufferSize, (FileOptions)0x20000000);

0x20000000 - это флаг, который еще не имеет перечисления в .NET Framework, но в основном говорит, что не использует кеш.

http://msdn.microsoft.com/en-us/library/cc644950%28v=VS.85%29.aspx

1 голос
/ 08 сентября 2010

Интересно, сдерживает ли сам цикл сборщик мусора, сгенерированный в цикле?Есть статья Microsoft KB , описывающая ситуацию для однопоточного консольного приложения.Я бы предложил добавить [MTAThread] к основному методу, как предложено в статье.

0 голосов
/ 08 сентября 2010

Вы получите более высокую пропускную способность как в сети, так и на локальном компьютере, используя асинхронную работу. обработка ...

Посмотрите на метод BeginRead ...

0 голосов
/ 08 сентября 2010

Что было бы наиболее интересно узнать, если CopyFile делает то же самое.Не видя остальной части кода, это довольно сложно сказать.Одна не очень необычная вещь, которая случается с людьми, заключается в том, что они заполняют системный кеш грязными данными, поэтому он некоторое время кричит (просто выполняет кучу кэшированных операций ввода-вывода), а затем значительно замедляется, когда начинается запись.Именно тогда вы узнаете, насколько быстро ваша реализация копирования ... Тот факт, что она начинает идти на юг, когда размер находится в пределах размера оперативной памяти машины, является довольно интересным намеком ...

0 голосов
/ 08 сентября 2010

Ну, это зависит от того, как вы управляете потоком. Ты читаешь, пишешь в новый файл, чистишь буфер? Поскольку ОЗУ не может хранить в нем 120 ГБ.

Вы должны дать остальную часть кода, из того, что я вижу тут, нет никакой возможности помочь вам.

...