Быстрая запись массивного файла на ЖД
Как на си++ максимально эффективно (быстро) записать на логический диск файл, который займет его весь до предела. Меня интересует, чем можно быстро писать. Если fstream, то из каких соображений подбирать буфер и нужно ли его трогать вообще. Или нужно и вовсе унаследоваться откуда-нибудь с учетом специфики задачи. Или еще как? Пишу через fstream с буфером в 100 кластеров ntfs раздела в бинарном режиме и хочется как-то побыстрее.
Ну вроде как отображаемые файлы самые быстрые. Если я не прав поправьте меня.
От себя добавлю,что надо ещё асинхронную запись использовать(сам никогда не делал).Почитайте про CreateFile,там всё написано.Кстати да,лучше именно через API это делать
Сам никогда не занимался подобным извращением, но может стоит написать два варианта программы: один через СТЛ, второй через выньАПИ. И замерить время выполнения. Хотя почему то мне кажется через АПИ будет быстрее.
Цитата:
Хотя почему то мне кажется через АПИ будет быстрее.
STL по любому использует WinAPI. Однако специализированный класс может уже по дефолту использовать асинхронную запись или ещё что-нибудь для ускорения записи... Но используя правильные функции WinAPI всегда можно обогнать по скорости STL. Пусть и не всегда намного.
в Ц/Ц++ не помню как эта функция/метод называется, но в винапи это SetEndOfFile(). Записью (иногда, нулей) займется сама ОС.
Если в STL есть возможность передать хэндл на файл - то стоит создать файл известного толстого размера через WinAPI (CreateFile + SetFileValidData + SetEndOfFile) и хэндл передать в fstream (или что-то там еще, чем удобнее пользоваться).
Цитата: hardcase
Если в STL есть возможность передать хэндл на файл - то стоит создать файл известного толстого размера через WinAPI (CreateFile + SetFileValidData + SetEndOfFile) и хэндл передать в fstream (или что-то там еще, чем удобнее пользоваться).
в линуксе есть такая возможность(создать поток по открытому файловому дескриптору), значит и в винде должно быть
в линукс для этого юзается __gnu_cxx::stdio_filebuf<char>
в винде не знаю... погуглите...