Il y a généralement deux niveaux de mise en mémoire tampon impliqués:
- Tampons internes
- Tampons du système d'exploitation
Les tampons internes sont des tampons créés par le runtime / la bibliothèque / le langage avec lequel vous programmez et sont destinés à accélérer les choses en évitant les appels système à chaque écriture. Au lieu de cela, lorsque vous écrivez dans un objet fichier, vous écrivez dans sa mémoire tampon, et chaque fois que la mémoire tampon se remplit, les données sont écrites dans le fichier réel à l'aide d'appels système.
Cependant, en raison des tampons du système d'exploitation, cela peut ne pas signifier que les données sont écrites sur le disque . Cela peut simplement signifier que les données sont copiées des tampons maintenus par votre runtime dans les tampons maintenus par le système d'exploitation.
Si vous écrivez quelque chose et qu'il se retrouve dans la mémoire tampon (uniquement) et que l'alimentation de votre machine est coupée, ces données ne sont pas sur le disque lorsque la machine s'éteint.
Donc, pour vous aider, vous disposez des méthodes flush
et fsync
, sur leurs objets respectifs.
Le premier flush
,, écrira simplement toutes les données qui persistent dans un tampon de programme dans le fichier réel. Cela signifie généralement que les données seront copiées du tampon du programme vers le tampon du système d'exploitation.
Plus précisément, cela signifie que si un autre processus a ce même fichier ouvert en lecture, il pourra accéder aux données que vous venez de rincer dans le fichier. Cependant, cela ne signifie pas nécessairement qu'il a été stocké «en permanence» sur le disque.
Pour ce faire, vous devez appeler la os.fsync
méthode qui garantit que tous les tampons du système d'exploitation sont synchronisés avec les périphériques de stockage auxquels ils sont destinés, en d'autres termes, cette méthode copiera les données des tampons du système d'exploitation sur le disque.
En règle générale, vous n'avez pas besoin de vous soucier de l'une ou l'autre des méthodes, mais si vous êtes dans un scénario où la paranoïa sur ce qui se termine réellement sur le disque est une bonne chose, vous devez effectuer les deux appels comme indiqué.
Addendum en 2018.
Notez que les disques avec des mécanismes de cache sont maintenant beaucoup plus courants qu'en 2013, il y a donc encore plus de niveaux de mise en cache et de tampons impliqués. Je suppose que ces tampons seront également gérés par les appels sync / flush, mais je ne sais pas vraiment.
with file('blah') as fd: #dostuff
construction, je sais qu'elle garantit la fermeture du descripteur de fichier. Est-ce qu'il est également vidé ou synchronisé?