Estou planejando escrever um aplicativo que tenta gravar o máximo possível no arquivo para nunca perder uma quantidade significativa de dados. Ele gravará cada toque de tecla, incluindo micro ou até nano-segundos, no disco. Agora, isso parece muito, mas ainda levará um pouco de tempo para atingir um GB de dados gravados. Para aliviar as coisas, pretendo gravar esses dados como atualizações no final do arquivo usando um fluxo de saída, mas liberarei o fluxo imediatamente depois.
Agora, com os SSDs, toda vez que escrevo dados, ele geralmente grava em um local diferente toda vez que uma atualização é realizada. Presumo que o OS/FS apenas envie "setores" para a unidade e que não seja capaz de distinguir que são apenas atualizações no final de um arquivo. Então, isso significaria que, embora as atualizações sejam pequenas, isso definitivamente afetará o nivelamento de desgaste do SSD.
A descrição acima está correta e devo considerar uma quantidade razoável de buffer no aplicativo? Quanto os sistemas de arquivos modernos armazenam em cache antes de gravar no SSD? Ou o buffer dentro do próprio SSD virá em socorro? Alguém já fez uma análise desse uso?
Em uma situação como essa, o sistema operacional deve armazenar em buffer suas gravações e liberá-las a cada poucos segundos. Além disso, a maioria dos SSDs implementa alguma forma limitada de buffer de gravação que é "segura" para que não perca dados em caso de falha de energia. Observe que a maioria dos dispositivos de armazenamento e sistemas operacionais operam em blocos de 4 KB, portanto, o sistema não gravará bytes únicos no disco.
Dito isso, se seu aplicativo precisar gravar continuamente pequenas quantidades de dados no disco, é melhor usar explicitamente um buffer de gravação, implementando um de sua preferência ou usando um recurso de SO apropriado. Cada gravação de disco carrega uma quantidade não trivial de sobrecarga no nível do sistema operacional, portanto, você deve gravar em um buffer de memória que é liberado em um intervalo apropriado ou quando o buffer atinge um determinado tamanho (por exemplo, várias dezenas ou centenas de KBs).
Se você estiver gravando blocos de dados razoavelmente grandes em intervalos regulares e não sobrescrevendo dados em locais aleatórios no disco - e parece que você está apenas gravando um fluxo contínuo de dados de log - você não deve experimentar amplificação de gravação excessiva ou degradação atuação. O nivelamento de desgaste da unidade funcionará bem aqui.