Какой алгоритм стоит за Robocopy? - PullRequest
5 голосов
/ 21 октября 2010

Мне любопытно узнать, что делает Robocopy (Robust File Copy) такой быстрой и надежной.Кто-нибудь знает, какой API / Algo используется для Robocopy?Кто-нибудь изучал Robocopy?

Я спрашиваю, поскольку мне нужно написать метод (в .NET / C #), который будет копировать каталоги / файлы быстро и без ошибок ... Объем данных может доходить до 15 ГБЯ не могу просто позвонить в Robocopy по разным причинам.

Спасибо!

1 Ответ

13 голосов
/ 21 октября 2010

Вы можете очень близко приблизиться к скорости Robocopy с помощью простой программы на C #, которая выполняет асинхронное чтение и запись с использованием стандартного FileStream с буфером 64 КБ.Больший размер буфера до 256К даст небольшое увеличение производительности.Больше чем 256K замедлит вещи до удивительной степени.В моих тестах использование буфера 512 КБ занимало почти вдвое больше времени, чем копирование с буфером 256 КБ.

Идея довольно проста:

Read the first buffer from the source file
do
{
    start asynchronous write to destination file.
    Read the next buffer from the source file
    wait for asynchronous write to complete
} while not end of file

Это довольно простая вещь для написания.Моя программа, которая делает это почти так же быстро, как Robocopy, и не вызывает проблем типа , которые Robocopy вызывает , когда вы копируете очень большой (сто гигабайт) файл с сервера.

Немного больше информации о проблеме копирования большого файла.

Обратите внимание, что эта асинхронная операция чтения / записи не сильно влияет на производительность, если вы читаете и пишете втот же физический диск.Это наиболее эффективно, когда источник и место назначения находятся на разных дисках.

...