Normalmente hay dos niveles de almacenamiento intermedio involucrados:
- Tampones internos
- Tampones del sistema operativo
Los búferes internos son búferes creados por el tiempo de ejecución / biblioteca / lenguaje contra el que está programando y están destinados a acelerar las cosas al evitar las llamadas al sistema para cada escritura. En cambio, cuando escribe en un objeto de archivo, escribe en su búfer, y cada vez que el búfer se llena, los datos se escriben en el archivo real mediante llamadas al sistema.
Sin embargo, debido a los búferes del sistema operativo, esto podría no significar que los datos se escriben en el disco . Puede significar que los datos se copian de las memorias intermedias mantenidas por su tiempo de ejecución en las memorias intermedias mantenidas por el sistema operativo.
Si escribe algo y termina en el búfer (solo), y se corta la alimentación de su máquina, esos datos no están en el disco cuando la máquina se apaga.
Entonces, para ayudar con eso, tiene los métodos flush
y fsync
, en sus respectivos objetos.
El primero, flush
simplemente escribirá cualquier dato que permanezca en un búfer de programa en el archivo real. Normalmente, esto significa que los datos se copiarán del búfer del programa al búfer del sistema operativo.
Específicamente, lo que esto significa es que si otro proceso tiene ese mismo archivo abierto para lectura, podrá acceder a los datos que acaba de vaciar al archivo. Sin embargo, no significa necesariamente que se haya almacenado "permanentemente" en el disco.
Para hacer eso, debe llamar al os.fsync
método que garantiza que todos los búferes del sistema operativo estén sincronizados con los dispositivos de almacenamiento para los que están destinados, en otras palabras, ese método copiará los datos de los búferes del sistema operativo al disco.
Por lo general, no necesita molestarse con ninguno de los métodos, pero si se encuentra en un escenario donde la paranoia sobre lo que realmente termina en el disco es algo bueno, debe hacer ambas llamadas según las instrucciones.
Anexo en 2018.
Tenga en cuenta que los discos con mecanismos de caché ahora son mucho más comunes que en 2013, por lo que ahora hay aún más niveles de almacenamiento en caché y búferes involucrados. Yo asumo estos tampones estarán a cargo de las llamadas de sincronización / ras así, pero no se sabe muy bien.
with file('blah') as fd: #dostuff
construcción, sé que garantiza el cierre del descriptor de archivo. ¿También se descarga o se sincroniza?fsync
Es necesario para la atomicidad. no puede esperar cerrar un archivo, volver a abrirlo y encontrar su contenido sin unfsync
en el medio. A menudo funciona, pero no funciona en Linux con ext4 y las opciones de montaje predeterminadas, por ejemplo. Tampocofsync
se garantiza que realmente gire la plancha con imán en las bandejas, ya que 1: fsync se puede deshabilitar (en modo portátil) y 2: el almacenamiento en búfer interno del disco duro podría no recibir instrucciones de descarga.Porque el sistema operativo puede no hacerlo. La operación de vaciado fuerza los datos del archivo a la memoria caché del archivo en la RAM, y desde allí el trabajo del sistema operativo es enviarlo al disco.
fuente
actually
es relativo aquí: si el dispositivo de destino tiene habilitado el almacenamiento en caché de escritura, es posible que los datos no hayan alcanzado los platos / chips reales cuandoos.fsync()
regrese.Vacía el búfer interno, lo que se supone que hace que el sistema operativo escriba el búfer en el archivo. [1] Python usa el almacenamiento en búfer predeterminado del sistema operativo a menos que lo configure de otra manera.
Pero a veces el sistema operativo aún elige no cooperar. Especialmente con cosas maravillosas como retrasos de escritura en Windows / NTFS. Básicamente, el búfer interno está enjuagado, pero el búfer del sistema operativo todavía lo mantiene. Por lo tanto, debe decirle al sistema operativo que lo escriba en el disco
os.fsync()
en esos casos.[1] http://docs.python.org/library/stdtypes.html
fuente
Básicamente, flush () limpia su búfer de RAM, su poder real es que le permite continuar escribiendo en él después, pero no debe considerarse como la mejor / más segura función de escritura en archivo. Está vaciando su RAM para que lleguen más datos, eso es todo. Si desea asegurarse de que los datos se escriban en un archivo de forma segura, use close () en su lugar.
fuente