qu'est-ce exactement le python du fichier.flush() est en train de faire?
J'ai trouvé ça dans le Python documentation pour les Objets Fichier:
flush() n'est pas nécessairement écrire des données du fichier sur le disque. Utiliser la méthode flush (), suivie par l'os.fsync() pour s'assurer de ce comportement.
Donc ma question est: quel est exactement Python flush
faire? J'ai pensé qu'il oblige à écrire des données sur le disque, mais maintenant je vois que ça ne marche pas. Pourquoi?
Vous devez vous connecter pour publier un commentaire.
Il existe en général deux niveaux de mise en mémoire tampon impliqués:
L'intérieur des tampons tampons créés par le moteur d'exécution/bibliothèque/la langue que vous êtes à la programmation contre 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 fichier, vous écrivez dans sa mémoire tampon, et chaque fois que le tampon est plein, les données sont écrites dans le fichier, à l'aide des appels système.
Cependant, en raison du système d'exploitation tampons, cela ne peut pas dire que les données sont écrites à disque. Il peut tout simplement dire que les données sont copiées de la mémoire gérée par votre moteur d'exécution dans les tampons maintenu par le système d'exploitation.
Si vous écrivez quelque chose, et il se termine dans la mémoire tampon (seulement), et que le courant est coupé à votre machine, et que les données n'est pas sur le disque lorsque l'ordinateur s'éteigne.
Donc, afin de les aider avec cela, vous avez la
flush
etfsync
méthodes, sur leurs objets respectifs.La première,
flush
, tout simplement écrire toutes les données qui s'éternise dans un programme de la mémoire tampon de la taille réelle du fichier. Typiquement, cela signifie que les données seront copiées à partir du programme de la mémoire tampon pour le système d'exploitation de la mémoire tampon.Précisément ce que cela signifie, c'est que si un autre 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 le
os.fsync
méthode qui garantit à tous les système d'exploitation tampons sont synchronisés avec les périphériques de stockage, ils sont, en d'autres termes, cette méthode de copie des données à partir du système d'exploitation tampons sur le disque.En général, vous n'avez pas besoin de s'embêter avec la méthode, mais si vous êtes dans un scénario où la paranoïa sur ce qui se termine effectivement en place sur le disque est une bonne chose, vous devez faire deux appels, comme indiqué.
Additif en 2018.
Notez que les disques avec des mécanismes de cache est maintenant beaucoup plus courant que de retour en 2013, alors maintenant, il y a encore plus de niveaux de mise en cache et les tampons en cause. Je assumer ces tampons seront traitées par le sync/flush appelle ainsi, mais je ne sais pas vraiment.
with file('blah') as fd: #dostuff
construire, je sais qu'il garantit la fermeture du descripteur de fichier. Est-il aussi de la chasse ou de la synchronisation?fsync
est nécessaire pour l'atomicité. vous ne pouvez pas vous attendre à la fermeture d'un fichier, l'ouvrir à nouveau et de trouver votre contenu sansfsync
dans le milieu. Il travaille souvent, mais il n'est pas sur linux ext4 par défaut et les options de montage par exemple. Aussifsync
n'est pas garanti vraiment aimant-retourner le fer sur les plateaux, parce que 1: fsync peut être désactivé (par laptop-mode), et 2: le disque dur interne de mise en mémoire tampon peut ne pas être chargé de chasse d'eau.sync
commandeParce que le système d'exploitation ne peut pas le faire. L'opération de vidage de forces le fichier de données dans le fichier cache dans la RAM, et à partir de là, c'est le système d'exploitation du poste pour envoyer effectivement sur le disque.
actually
est relatif: si le périphérique cible est activé le cache d'écriture, les données peuvent ne pas avoir atteint la réelle plateaux/jetons quandos.fsync()
retourne.Il vide la mémoire tampon interne, qui est censé provoquer l'OS pour écrire le contenu du buffer dans le fichier.[1] Python utilise le système d'exploitation par défaut du tampon, à moins que vous le configurez faire autrement.
Mais parfois, les OS encore choisit de ne pas coopérer. Surtout avec de merveilleuses choses comme l'écriture des retards dans Windows/NTFS. Fondamentalement, la mémoire tampon interne est vidé, mais le tampon de l'OS est toujours la conserver. Donc, vous avez à dire à l'OS de l'écrire sur le disque avec
os.fsync()
dans ces cas.[1] http://docs.python.org/library/stdtypes.html
Fondamentalement, la méthode flush() nettoie votre zone de mémoire RAM, de son vrai pouvoir, c'est qu'il vous permet de continuer à écrire la suite, mais il ne doit pas être considéré comme le meilleur/le plus sûr d'écrire à la fonctionnalité de fichier. C'est le rinçage de votre RAM pour plus de données à venir, c'est tout. Si vous voulez vous assurer que les données sont écrites sur le fichier en toute sécurité, puis utiliser close() à la place.