A razão pela qual isso acontece é que o programa diz "grave esses dados" e o kernel do linux os copia em um buffer de memória na fila para ir para o disco e depois diz "ok, pronto". Então o programa pensa que copiou tudo. Em seguida, o programa fecha o arquivo, mas de repente o kernel o faz esperar enquanto esse buffer é enviado para o disco.
Portanto, infelizmente, o programa não pode dizer quanto tempo levará para liberar o buffer, porque ele não sabe.
Se você quiser experimentar alguns truques para usuários avançados, poderá reduzir o tamanho do buffer usado pelo Linux configurando o parâmetro kernel vm.dirty_bytes
para algo como 15000000
(15 MB). Isso significa que o aplicativo não pode ter mais de 15 MB à frente de seu progresso real. (Você pode alterar os parâmetros do kernel rapidamente, sudo sysctl vm.dirty_bytes=15000000
mas fazê-los permanecer em uma reinicialização requer a alteração de um arquivo de configuração, como o /etc/sysctl.conf
que pode ser específico para sua distribuição.)
Um efeito colateral é que seu computador pode ter uma taxa de transferência de gravação de dados mais baixa com essa configuração, mas, no geral, acho útil ver que um programa está em execução por um longo tempo enquanto grava muitos dados versus a confusão de ter um O programa parece ter sido concluído com o seu trabalho, mas o sistema está muito atrasado, pois o kernel faz o trabalho real. Definir dirty_bytes
um valor razoavelmente pequeno também pode ajudar a impedir que o sistema deixe de responder quando você está com pouca memória livre e executa um programa que repentinamente grava muitos dados.
Mas, não o ajuste muito pequeno! Uso 15 MB como uma estimativa aproximada de que o kernel pode liberar o buffer para um disco rígido normal em 1/4 de segundo ou menos. Isso evita que meu sistema fique "atrasado".