Il motivo per cui accade in questo modo è che il programma dice "scrivi questi dati" e il kernel Linux lo copia in un buffer di memoria che è in coda per andare su disco, e poi dice "ok, fatto". Quindi il programma pensa di aver copiato tutto. Quindi il programma chiude il file, ma all'improvviso il kernel lo fa attendere mentre quel buffer viene inviato al disco.
Quindi, sfortunatamente il programma non può dirti quanto tempo ci vorrà per svuotare il buffer perché non lo sa.
Se vuoi provare alcuni trucchetti per utenti esperti, puoi ridurre la dimensione del buffer utilizzato da Linux impostando il parametro del kernel vm.dirty_bytes
a qualcosa come 15000000
(15Mb). Ciò significa che l'applicazione non può anticipare di oltre 15 MB il suo effettivo avanzamento. (Puoi cambiare i parametri del kernel al volo con sudo sysctl vm.dirty_bytes=15000000
ma per farli rimanere dopo un riavvio è necessario modificare un file di configurazione come /etc/sysctl.conf
che potrebbe essere specifico per la tua distribuzione.)
Un effetto collaterale è che il tuo computer potrebbe avere un throughput di scrittura dei dati inferiore con questa impostazione, ma nel complesso, trovo utile vedere che un programma è in esecuzione a lungo mentre scrive molti dati rispetto alla confusione di avere un sembra che il programma abbia finito con il suo lavoro, ma il sistema è in grave ritardo mentre il kernel fa il lavoro vero e proprio. Impostazione dirty_bytes
a un valore ragionevolmente basso può anche aiutare a impedire che il tuo sistema non risponda quando hai poca memoria libera ed esegui un programma che scrive improvvisamente molti dati.
Ma non impostarlo troppo piccolo! Uso 15 MB come stima approssimativa che il kernel possa scaricare il buffer su un normale disco rigido in 1/4 di secondo o meno. Impedisce al mio sistema di sentirsi "laggy".