¿Cuál es el beneficio de escribir en una ubicación temporal, y luego copiarlo en el destino deseado?

46

Estoy escribiendo una aplicación que funciona con imágenes satelitales, y mi jefe me pidió ver algunas de las aplicaciones comerciales y ver cómo se comportan. Encontré un comportamiento extraño y luego, mientras miraba, lo encontré también en otras aplicaciones estándar.

Estos programas primero escriben en la carpeta temporal y luego lo copian en el destino deseado.

Ejemplo: 7zip extrae primero a la carpeta temporal y luego copia los datos extraídos a la ubicación a la que le pidió que extrajera los datos.

Veo varios problemas con este enfoque:

  1. Es posible que la carpeta temporal no tenga suficiente espacio, mientras que la carpeta la ubicación puede tener mucho espacio.

  2. Si es un archivo grande, puede tomar una cantidad de tiempo no despreciable para la operación de copia.

Lo pensé mucho, pero no pude ver un solo punto positivo para hacer esto. ¿Me estoy perdiendo algo o hay un beneficio real al hacer esto?

    
pregunta Devdatta Tengshe 16.06.2012 - 16:48

3 respuestas

92

Algunas razones que se me ocurren:

  • En la mayoría de las plataformas, los movimientos de archivos son atómicos, pero las escrituras de archivos no lo son (especialmente si no puede escribir todos los datos de una sola vez). Por lo tanto, si tiene el patrón típico de productor / consumidor (un proceso produce archivos, el otro mira un directorio y recoge todo lo que encuentra), escribiendo primero en una carpeta temporal y luego, luego, trasladándose a la ubicación real significa que el consumidor nunca podrá ver una archivo sin terminar.
  • Si el proceso que escribe el archivo muere a la mitad, tiene un archivo roto en su disco. Si se encuentra en una ubicación real, debe encargarse de limpiarlo usted mismo, pero si se encuentra en una ubicación temporal, el sistema operativo se encargará de ello.
  • Si se crea el archivo mientras se está ejecutando un trabajo de copia de seguridad, el trabajo puede recoger un archivo incompleto; los directorios temporales generalmente se excluyen de las copias de seguridad, por lo que el archivo solo se incluirá una vez que se mueva al destino final.
  • El directorio temporal puede estar en un sistema de archivos rápido pero volátil (por ejemplo, un disco RAM), lo que puede ser beneficioso para cosas como la descarga de varios fragmentos del mismo archivo en paralelo o el procesamiento in situ en el archivo con lotes. de busca. Además, los directorios temporales tienden a causar más fragmentación que los directorios con lecturas, escrituras y eliminaciones menos frecuentes, y mantener el directorio temporal en una partición separada puede ayudar a mantener baja la fragmentación de las otras particiones.

TL; DR: se reduce principalmente a la atomicidad, es decir, debes hacerlo para que (en la ubicación final) el archivo esté completo o no esté disponible en ningún momento.

    
respondido por el tdammers 16.06.2012 - 17:12
15

Esto parece ser un problema en Windows, más específicamente relacionado con cómo se maneja el arrastrar y soltar.

Los desarrolladores del cliente WINSCP han desarrollado su propia extensión de shell, que anula este comportamiento de arrastrar y soltar y permite soltar el archivo a la carpeta correcta de inmediato. Explican el truco en su documentación y, lo que es más interesante, cuál es el problema y cómo lo resolvieron.

Aquí está la parte interesante:

  

La mecánica de arrastrar y soltar de Windows no permite la aplicación de origen de   Arrastre y suelte la operación para descubrir fácilmente dónde se sueltan los archivos.   Depende de la aplicación de destino (normalmente el Explorador de Windows) transferir   archivos a destino. Es bastante razonable, porque la fuente   La aplicación difícilmente puede transferir archivos a todos los destinos posibles.   Tenga en cuenta que puede colocar archivos no solo en un directorio, sino también   a archivo ZIP (o cualquier otro archivo), directorio remoto (a través de FTP, SFTP,   SCP, ...), basura, ...

     

Obviamente, incluso el Explorador de Windows (o cualquier otra aplicación de destino, como   WinZip) no puede descargar archivos de ninguna fuente posible (particularmente   no se conoce SFTP / SCP).

También, específicamente para 7Zip: el usuario ray023 responde a esta pregunta en la pila de superusuarios Q & A: enlace

Básicamente, si en lugar de arrastrar y soltar su archivo, utiliza el método "extraer aquí" disponible en 7-ZIP y Winrar, los archivos están directamente en el directorio correcto.

    
respondido por el Jalayn 16.06.2012 - 17:06
0

Si tiene que realizar cualquier tipo de procesamiento de datos en el archivo (decodificación / conversión / etc.), es mejor usar un archivo temporal y, una vez completado, y solo si está completo, transferir el resultado al destino final. .

Beneficios:

  1. Sólo los archivos completados llegan a destino
  2. El archivo temporal puede (debería) residir en medios rápidos
  3. Evita la fragmentación en el archivo final
  4. Permite el uso de otros medios como destino final (ftp, cloud, lo que sea)
  5. Los archivos temporales abortados son más fáciles de limpiar

No veo beneficios reales de escribir directamente en el destino mientras se procesan los datos.

    
respondido por el roetnig 10.01.2017 - 16:55

Lea otras preguntas en las etiquetas