2009-03-03 12 views
5

Tengo un archivo abierto para escritura y un proceso que se ejecuta durante días: algo está escrito en el archivo en momentos relativamente aleatorios. Tengo entendido que, hasta que archive file.close(), existe la posibilidad de que no haya nada realmente guardado en el disco. ¿Es eso cierto?¿existe COMMIT analógico en python para escribir en un archivo?

¿Qué sucede si el sistema se bloquea cuando el proceso principal aún no ha finalizado? ¿Hay alguna manera de hacer una especie de compromiso una vez cada ... digamos - 10 minutos (y llamo a esto comprometerme - no es necesario ejecutar el temporizador)? ¿Archivar file.close() y abrir (archivo, 'a') de la única manera, o hay mejores alternativas?

Respuesta

17

Debería poder usar file.flush() para hacer esto.

3

Si no quiere matar el proceso actual para agregar f.flush() (parece que ha estado funcionando durante días?), Debería estar bien. Si ve el archivo que está escribiendo cada vez más grande, usted no perderá esos datos ...

Desde documentación de Python:

escritura (str) escribir una cadena en el archivo. No hay valor de retorno Debido al almacenamiento en búfer, , la cadena puede no mostrarse en el archivo hasta que se llame al método flush() o close() .

Parece que el sistema de almacenamiento en búfer de Python vaciará automáticamente los objetos del archivo, pero no se garantiza cuando eso suceda.

2

Para asegurarse de que sus datos están escritos en el disco, use file.flush() seguido de os.fsync(file.fileno()).

2

Como ya se ha indicado, utilice el método .flush() para forzar la escritura del búfer, pero evite utilizar muchas llamadas para vaciar ya que esto puede ralentizar su escritura (si la aplicación se basa en escrituras rápidas)) ya que obligarás a tu sistema de archivos a escribir cambios que son más pequeños que su tamaño de búfer, lo que puede hacerte caer de rodillas. :)

Cuestiones relacionadas