Я планирую написать приложение, которое попытается записать в файл как можно больше данных, чтобы не потерять ни одного существенного объема данных. Оно будет записывать на диск каждое нажатие клавиши, включая микро- или даже наносекундное время. Сейчас это звучит как много, но все равно потребуется довольно много времени, чтобы достичь ГБ записанных данных. Чтобы облегчить ситуацию, я планирую записывать эти данные как обновления в конец файла, используя выходной поток, но я сразу же после этого сброшу поток.
Теперь с SSD, каждый раз, когда я записываю данные, они обычно записываются в другое место каждый раз, когда выполняется обновление. Я предполагаю, что ОС/ФС просто отправляет "сектора" на диск, и что она не сможет отличить, что это просто обновления в конце файла. Так что это будет означать, что даже если обновления небольшие, это определенно зафиксирует выравнивание износа SSD до бесконечности.
Правильно ли приведенное выше описание и следует ли мне рассмотреть разумный объем буферизации в приложении? Насколько современные файловые системы будут кэшировать себя перед записью на SSD? Или на помощь придет буферизация внутри самого SSD? Проводил ли кто-нибудь анализ такого использования?
решение1
В такой ситуации ОС должна буферизировать ваши записи и сбрасывать их каждые несколько секунд или около того. Кроме того, большинство SSD-накопителей реализуют некоторую ограниченную форму буферизации записи, которая является «безопасной», так что она не потеряет данные в случае сбоя питания. Обратите внимание, что большинство устройств хранения и ОС работают блоками по 4 КБ, поэтому система не будет записывать отдельные байты на диск.
Тем не менее, если вашему приложению необходимо непрерывно записывать небольшие объемы данных на диск, лучше всего явно использовать буфер записи, либо реализовав его самостоятельно, либо используя соответствующую функцию ОС. Каждая запись на диск несет нетривиальный объем накладных расходов на уровне ОС, поэтому вам следует записывать в буфер памяти, который очищается с соответствующим интервалом или когда буфер достигает определенного размера (например, нескольких десятков или сотен КБ).
Если вы записываете достаточно большие порции данных через регулярные интервалы и не перезаписываете данные в случайных местах на диске — и это выглядит так, будто вы просто пишете непрерывный поток данных журнала — вы не должны испытывать чрезмерного усиления записи или ухудшения производительности. Выравнивание износа диска здесь справится отлично.