2010-04-24 9 views

Respuesta

49

Atomic en general significa que la operación no se puede interrumpir se completará o no tendrá ningún efecto. Al escribir archivos, esto se logra escribiendo en un archivo temporal y luego reemplazando el original con el temporal cuando se completa la escritura.

Un bloqueo al escribir un archivo atómico significa que el original no se ha modificado y hay un archivo de basura que se puede eliminar. Un bloqueo al escribir normalmente significaría que un archivo bueno esperado está dañado.

En cuanto a rendimiento, el costo es mínimo. Durante la escritura tendrá dos copias de un archivo. El reemplazo de archivos es una operación muy simple en el nivel del sistema de archivos.

Edit: Gracias zneak

+6

Atomic rather significa que la operación se realiza total o parcialmente. Se puede interrumpir o detener o reanudar, simplemente no alterará el estado del sistema hasta que esté completo. Sin embargo, la conclusión sigue siendo la misma. – zneak

+0

No diría esto como "tendrá dos copias de un archivo", ya que es muy fácil de leer, es decir, dos copias de los mismos datos exactos, que no es lo que está sucediendo. –

0

sistemas de ficheros no tienen que recurrir a escribir/cambiar el nombre de ciclos de escritura atómicas. Los sistemas de archivos que tienen semántica de bloqueo le permiten "bloquear" partes o todo un archivo, o en algunos casos incluso hacer cosas como agregar a un archivo, para ayudar con la atomicidad.

@Randy, es probable que sus dos suposiciones sobre la fragmentación sean incorrectas. En la mayoría de los sistemas de archivos, escribir un archivo completo y cerrarlo dará como resultado un archivo menos fragmentado, y escribir un archivo grande en una sola escritura definitivamente dará como resultado un mejor uso de bloques grandes. Si se refería a que los bloques de archivos tenían más probabilidades de 'arrastrarse' en el disco, eso depende de las preferencias de diseño en su sistema de archivos. Si está escribiendo en flash, probablemente desee que el sistema de archivos se filtre a través del almacenamiento disponible como una especie de auto-nivelación de las escrituras.

0

Escribir atómicamente requiere más pasos: adicionalmente se crea el archivo auxiliar. NSString Clase Reference explica:

En caso afirmativo, el receptor se escribe en un archivo auxiliar, y luego el archivo auxiliar se cambia el nombre a la ruta. Si NO, el receptor se escribe directamente en la ruta. La opción SÍ garantiza que la ruta, si existe en , no se corromperá aunque el sistema se bloquee durante la escritura .

Aquí es el ejemplo en el caso de plists:

[array writeToFile:path atomically:YES]; 

cuando "SI", entonces PLIST se actualiza sólo una vez, incluso si se ejecuta el código varias veces en XCode,

[array writeToFile:path atomically:NO]; 

cuando "NO" se actualiza tantas veces como ejecute el mismo código (actualización repetida).

+0

no tienen idea de por qué algunas personas rechazaron la respuesta sin explicaciones. –

+1

Creo que porque creen que no debe confiar en las complejidades indocumentadas de una API para superar errores serios de programación. – malhal

+0

Gracias por el comentario, lo expliqué más. –

Cuestiones relacionadas