Есть ли способ ускорить частые операции записи файлов? CFile
Моя задача - записывать небольшие части данных в файл часто и с гарантией. Это своего рода система регистрации, которая должна обеспечивать гарантированную безопасность и скорость сохранения данных на диск. Я обнаружил, что тормоза появляются в функции Flush(), которая вызывается слишком часто. Итак, я решил избавиться от этого.
Я использовал флаги, которые запрещают буферизацию и кеширование данных (osNoBuffer и writeThrough). После этого, как я понимаю, я мог выполнять операции ввода-вывода файла (записывать данные в файл) без использования flush()? Еще один вопрос. Как понять, что данные однозначно записываются на диск без кеширования и буферизации? Это правильный способ сделать то, что я хочу, или может быть другой способ ускорить частые операции записи файлов?
1 ответ
flush()
занимает так много времени, именно потому, что устанавливает гарантию, которую вы ищете. Файлы обычно записываются на диск, на котором (вероятно) крутятся ржавые диски. Файлы физически разбросаны по поверхности этих дисков, и для перемещения головки чтения / записи в нужное место требуются миллисекунды. 50 сбросов в секунду означает в среднем 20 миллисекунд на сброс, что близко к тому, что может сделать ваш диск механически.
Без сброса ваши записи объединяются, поэтому для нескольких записей потребуется только одно движение головки чтения / записи. Даже без проверки конкретных флагов это обязательно должно означать, что данные временно находятся под угрозой.
Только в программном обеспечении вы никогда не узнаете, действительно ли данные записаны на диск. Мы знаем это благодаря исследованиям, проведенным Sun при разработке файловой системы ZFS. Оказывается, что более дешевые и медленные диски связаны с очисткой и возвращаются до того, как данные действительно будут очищены. Вам понадобятся диски серверного уровня, чтобы гарантировать это.
SSD работают достаточно хорошо в этой области. Им не нужно физически двигать пишущие головки. Поэтому у них меньше стимулов лгать о флешах.