J'ai trouvé cela dans la documentation Python pour File Objects :
flush () n’écrit pas nécessairement les données du fichier sur le disque. Utilisez flush () suivi de os.fsync () pour garantir ce comportement.
Ma question est donc la suivante: que fait exactement la flush
de Python? Je pensais que cela obligeait à écrire des données sur le disque, mais je vois maintenant que ce n'est pas le cas. Pourquoi?
Il existe généralement deux niveaux de mise en mémoire tampon:
Les tampons internes sont des tampons créés par le runtime/la bibliothèque/le langage que vous programmez et sont conçus pour 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 son tampon et chaque fois que le tampon est plein, les données sont écrites dans le fichier réel à l'aide d'appels système.
Toutefois, en raison des mémoires tampons du système d’exploitation, il se peut que cela ne signifie pas que les données sont écrites sur le disque. Cela peut simplement signifier que les données sont copiées à partir des tampons gérés par votre environnement d'exécution dans les tampons gérés par le système d'exploitation.
Si vous écrivez quelque chose et que celui-ci se termine dans la mémoire tampon (uniquement), et que votre ordinateur est mis hors tension, ces données ne sont pas sur le disque lorsque la machine s'éteint.
Donc, pour vous aider avec cela, vous avez les méthodes flush
et fsync
, sur leurs objets respectifs.
La première, flush
, écrira simplement toutes les données présentes dans un tampon de programme dans le fichier réel. Cela signifie généralement que les données seront copiées de la mémoire tampon du programme dans la mémoire tampon du système d'exploitation.
Cela signifie en particulier que si un autre processus a le même fichier en lecture, il pourra accéder aux données que vous venez de vider 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 méthode os.fsync
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 embêter avec l'une ou l'autre méthode, mais si vous vous trouvez dans un scénario où la paranoïa sur ce qui se termine sur le disque est une bonne chose, vous devez passer les deux appels comme indiqué.
Addendum en 2018.
Notez que les disques dotés de mécanismes de cache sont maintenant beaucoup plus répandus qu'en 2013, de sorte que davantage de niveaux de mise en cache et de mémoires tampons sont impliqués. Je suppose ces tampons seront également traités par les appels de synchronisation/vidage, mais je ne le sais pas vraiment.
Parce que le système d'exploitation ne peut pas le faire. L'opération de vidage force les données de fichier dans le cache de fichier dans la RAM, et à partir de là, le travail du système d'exploitation consiste à les envoyer sur le disque.
Il vide le tampon interne, ce qui est supposé obliger le système d'exploitation à écrire le tampon dans le fichier. [1] Python utilise la mise en mémoire tampon par défaut du système d'exploitation, à moins que vous ne le configuriez autrement.
Mais parfois, le système d'exploitation choisit toujours de ne pas coopérer. Surtout avec des choses merveilleuses comme les délais d'écriture dans Windows/NTFS. Fondamentalement, la mémoire tampon interne est vidée, mais la mémoire tampon du système d'exploitation est toujours conservée. Vous devez donc dire au système d'exploitation de l'écrire sur le disque avec os.fsync()
dans ces cas.
Fondamentalement, flush () nettoie votre tampon RAM. Son véritable pouvoir réside dans le fait qu’il vous permet de continuer à écrire dessus - mais cela ne doit pas être considéré comme la meilleure fonctionnalité d’écriture sur fichier. C'est vider votre RAM pour plus de données à venir, c'est tout. Si vous voulez vous assurer que les données sont écrites dans un fichier en toute sécurité, utilisez plutôt close ().