Quel est exactement le fichier de python?flush() se porte bien?

j'ai trouvé ceci dans le Python documentation pour les objets de fichier :

flush () n'écrit pas nécessairement les données du fichier sur le disque. Utilisez flush () suivi de os.fsync() pour s'assurer de ce comportement.

alors ma question Est: Que fait exactement le flush de Python? Je pensais qu'il force à écrire des données sur le disque, mais maintenant je vois que ce n'est pas le cas. Pourquoi?

115
demandé sur Aaron Hall 2011-08-20 00:32:23

3 réponses

il y a généralement deux niveaux de buffering impliqués:

  1. tampons internes
  2. tampons de système D'exploitation

les tampons internes sont des tampons créés par l'exécution/la bibliothèque/le langage contre lequel vous programmez et est destiné à accélérer les choses en évitant les appels système pour chaque écriture. Au lieu de cela, lorsque vous écrivez à un objet file, vous écrivez dans son buffer, et chaque fois que le buffer remplit, les données sont écrites dans le fichier, à l'aide des appels système.

Cependant, en raison des tampons du système d'exploitation, cela pourrait ne pas signifier que les données sont écrites au disque . Cela signifie simplement que les données sont copiées à partir des tampons maintenus par votre exécution dans les tampons maintenus par le système d'exploitation.

si vous écrivez quelque chose, et qu'il finit dans le tampon (seulement), et que l'alimentation est coupée sur votre machine, Cette donnée n'est pas sur disque lorsque l'ordinateur s'éteigne.

donc, pour aider avec cela vous avez les méthodes flush et fsync , sur leurs objets respectifs.

le premier, flush , écrira simplement toutes les données qui s'attardent dans un tampon de programme au fichier réel. En général, cela signifie que les données seront copiées depuis le programme buffer vers le système d'exploitation buffer.

concrètement, cela signifie que si un autre le processus a ce même fichier ouvert en lecture, il sera en mesure d'accéder aux données que vous venez vidé le fichier. Toutefois, cela ne signifie pas nécessairement qu'il a été "définitivement" stocké sur le disque.

pour ce faire, vous devez appeler la méthode os.fsync qui assure que tous les tampons du système d'exploitation sont synchronisés avec les périphériques de stockage qu'ils sont pour, en d'autres termes, cette méthode va copier les données des tampons du système d'exploitation sur le disque.

typiquement vous n'avez pas besoin de vous embêter avec l'une ou l'autre méthode, mais si vous êtes dans un scénario où la paranoïa à propos de ce qui se termine réellement sur le disque est une bonne chose, vous devriez faire les deux appels selon les instructions.


Addendum en 2018.

notez que les disques avec des mécanismes de cache est maintenant beaucoup plus fréquente qu'en 2013, donc maintenant il ya encore plus de niveaux de cache et de tampons impliqués. I supposer ces tampons seront manipulés par la synchronisation/chasse appelle ainsi, mais je ne sais pas vraiment.

184
répondu Lasse Vågsæther Karlsen 2018-09-27 07:36:19

parce que le système d'exploitation peut ne pas le faire. L'opération flush force les données du fichier dans le cache du fichier en RAM, et de là, c'est le travail du système D'exploitation de l'envoyer effectivement sur le disque.

9
répondu Ignacio Vazquez-Abrams 2011-08-19 20:50:28

il chasse le buffer interne, qui est censé amener le système D'exploitation à écrire le buffer dans le fichier.[1] Python utilise le tampon par défaut du système d'exploitation à moins que vous ne le configuriez autrement.

mais parfois L'OS choisit toujours de ne pas coopérer. Surtout avec des choses merveilleuses comme les retards d'écriture dans Windows / NTFS. En gros, le tampon interne est vidangé, mais le tampon OS s'y accroche encore. Donc vous devez dire à L'OS de l'écrire sur le disque avec os.fsync() dans ces cas-là.

[1] http://docs.python.org/library/stdtypes.html

6
répondu Dan 2011-08-19 20:44:46