Скорость копирования
Доброго времени суток! Мне необходимо создать свой формат файла, в который должны будут кроме всего прочего помещаться в неизменном виде bmp-файлы довольно большого размера( Мб 20-30, а может и больше). Я столкнулся с такой проблемой, что при использовании ReadFile() и WriteFile() время копирования из одного файла в другой немного больше моих ожиданий( 5 Мб файл 36 секунд). Нельзя ли как-то ускорить процесс? Заранее спасибо!
А как вы это делаете? если побайтно, то медлительность неудивительна. А если читаете всё сразу в один буфер, а из него пишите в файл, то (если конечно буфер полностью помещается в памяти) вам поможет только новый, более быстрый жёский диск)) Ну может вам помогут отображаемые файлы... хотя скорость не сильно возрастёт...
Я смотрел на форуме RSDN тот же вопрос. Там советуют использовать буфер размером 32 или 64 Кб и на этом все.
Если размер файла намного меньше размера оперативной памяти, то лучше просто создать буфер в памяти размером в весь файл, считать в него и записать в другой файл. Это будет самый быстрый вариант. Ну а ели размер файла измеряется сотнями мегабайт, то лучше копировать небольшими частями как вам и посоветовали. Части можно взять и побольше 64 КБ, главное - кратные размеру кластера. Чем больше размер буфера, тем выше скорость, но если останется слишком мало свободной памяти, то скорость снизится. Надо выбирать оптимальный вариант.
Нифига. Не знаю с чем это связано (наверно завязано упреждающее чтение) но у меня максимальная скорость при размере буфера 32К. Если буфер больше,то производительность не увеличивается или даже чуть-чуть падает. Проверял опытным путем. Причем на других форумах так и советуют 32К делать.
Цитата: plastictown
Я смотрел на форуме RSDN тот же вопрос. Там советуют использовать буфер размером 32 или 64 Кб и на этом все.
А больше ничего и не надо! Нужно использовать буфер (можно и двумя килобайтами ограничиться)!
Функции ReadFile, WriteFile используют небуферизированный io, - разумеется скорость падает!
Код:
char* buffer=new char[32*1024];
А после того как сделал так:
Код:
char buffer[32*1024];
скорость возрасла в разы. 20 Мб файл копируется меньше секунды.
Всем спасибо!