Qual é o benefício de gravar em um local temporário e depois copiá-lo para o destino pretendido?

46

Estou escrevendo um aplicativo que funciona com imagens de satélite, e meu chefe me pediu para ver alguns dos aplicativos comerciais e ver como eles se comportam. Eu encontrei um comportamento estranho e, em seguida, como eu estava procurando, eu encontrei em outros aplicativos padrão também.

Estes programas primeiro gravam na pasta temporária e copiam-na para o destino pretendido.

Exemplo: o 7zip primeiro extrai a pasta temporária e copia os dados extraídos para o local para o qual você solicitou a extração dos dados.

Eu vejo vários problemas com essa abordagem:

  1. A pasta temporária pode não ter espaço suficiente, enquanto a a localização pode ter muito espaço.

  2. Se for um arquivo grande, pode levar um tempo não desprezível para a operação de cópia.

Pensei muito nisso, mas não consegui ver um único ponto positivo para fazer isso. Estou faltando alguma coisa, ou há um benefício real em fazer isso?

    
por Devdatta Tengshe 16.06.2012 / 16:48
fonte

3 respostas

92

Algumas razões pelas quais consigo pensar:

  • Na maioria das plataformas, as movimentações de arquivos são atômicas, mas as gravações de arquivos não são (especialmente se você não puder gravar todos os dados de uma só vez). Portanto, se você tiver o padrão típico produtor / consumidor (um processo produz arquivos, o outro assiste a um diretório e pega tudo o que encontrar), gravar primeiro em uma pasta temporária e só depois mover para o local real significa que o consumidor nunca verá um arquivo. arquivo inacabado.
  • Se o processo que grava o arquivo morrer no meio, você tem um arquivo quebrado no disco. Se estiver em um local real, você precisa cuidar de limpá-lo sozinho, mas se estiver em um local temporário, o sistema operacional cuidará disso.
  • Se o arquivo for criado enquanto uma tarefa de backup estiver em execução, o trabalho poderá selecionar um arquivo incompleto; Os diretórios temporários geralmente são excluídos dos backups, portanto, o arquivo só será incluído quando for movido para o destino final.
  • O diretório temporário pode estar em um sistema de arquivos rápido mas volátil (por exemplo, um disco virtual), que pode ser benéfico para coisas como fazer o download de vários fragmentos do mesmo arquivo em paralelo ou fazer processamento no local no arquivo com lotes de buscas. Além disso, os diretórios temporários tendem a causar mais fragmentação do que os diretórios com leituras, gravações e exclusões menos frequentes, e manter o diretório temporário em uma partição separada pode ajudar a manter a fragmentação das outras partições.

TL; DR - resume-se basicamente a atomicidade, ou seja, você quer fazer com que (no local final) o arquivo esteja completo ou não esteja em um determinado momento.

    
por 16.06.2012 / 17:12
fonte
15

Isso parece ser um problema no Windows, mais especificamente relacionado a como o arrastar e soltar é gerenciado.

Os desenvolvedores do cliente WINSCP desenvolveram sua própria extensão de shell, que substitui esse comportamento de arrastar e soltar e permite descartar o arquivo para a pasta correta imediatamente. Eles explicam o truque em sua documentação e, mais interessante, qual é o problema e como eles o resolveram.

Aqui está a parte interessante:

Windows drag&drop mechanics does not allow source application of drag&drop operation to find out easily, where the files are dropped. It is up to target application (Windows Explorer usually) to transfer files to destination. It is rather reasonable, because source application can hardly transfer files to all possible destinations. Keep in mind that you can drop files not only to a directory, but even to ZIP file (or any other archive), remote directory (via FTP, SFTP, SCP, …), trash, …

Obviously even Windows Explorer (or any other target application, like WinZip) cannot download files from any possible source (particularly it does not know SFTP/SCP).

Além disso, especificamente para o 7Zip: o usuário ray023 responde a essa pergunta na pilha SuperUser Q & A: link

Basicamente, se ao invés de arrastar o seu arquivo você usar o método "extrair aqui" disponível no bith 7-ZIP e no Winrar, os arquivos serão diretamente extraídos para o diretório correto.

    
por 16.06.2012 / 17:06
fonte
0

Se você tiver que fazer qualquer tipo de processamento de dados no arquivo (decode / convert / etc ..), é melhor usar um arquivo temporário e, quando concluído, e somente se concluído, transferir o resultado para o destino final .

Benefícios:

  1. Apenas os arquivos completos chegam ao destino
  2. O arquivo temporário pode (deve) residir em mídia rápida
  3. Evite a fragmentação no arquivo final
  4. Permite o uso de outras mídias como destino final (ftp, cloud, whatever)
  5. Arquivos temporários anulados são mais fáceis de limpar

Não vejo benefícios reais de escrever diretamente para o destino durante o processamento dos dados.

    
por 10.01.2017 / 16:55
fonte