Sé que el cuadro de diálogo de copia de Windows (en Windows XP) almacena primero la copia en la memoria, y todavía está copiando después de que se cierra el cuadro de diálogo, por lo que el tiempo está desactivado, pero ¿por qué es la estimación del tiempo que tomará hacer una copia? tan inexacto, incluso cuando la copia de memoria ha sido desactivada (en Vista y Windows 7) ¡Parece tan arbitrario! ¿Cómo funciona todo el procedimiento de copia y por qué Windows no puede estimarlo correctamente?
windows
file-transfer
Maxim Zaslavsky
fuente
fuente
Respuestas:
En resumen: los algoritmos deficientes y la estimación irregular son en realidad una debilidad de implementación.
Otras herramientas como TeraCopy hacen un mejor trabajo. Creo que no vale la pena explicar por qué su implementación no es buena. Lo habrán notado y mejorarán.
Lo que es difícil:
Para esto, no solo la cantidad de bytes sino la cantidad de archivos a crear juegan un papel. Si tiene un millón de archivos de 1 KB o mil archivos de 1 MB, la situación será bastante diferente porque el primero tiene la sobrecarga de crear muchos archivos. Dependiendo del sistema de archivos utilizado, esto podría llevar más tiempo que la transferencia de datos.
Este diálogo me volvió loco también un par de veces:
La copia moderna de Windows no es mucho mejor:
fuente
Raymond Chen escribió un muy buen artículo sobre esto una vez. Básicamente, el diálogo es solo adivinar :).
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/06/47937.aspx
fuente
Voy a contar hasta diez,
1....2....3....4
¿cuántos puntos se necesitarán para llegar a 10?5.6.7
¿Qué te parece ahora? ¿Toma en cuenta todos los puntos pasados entre los números y lo promedia, solo toma los últimos 4 intervalos y usa ese promedio, solo mira el último intervalo?Tiene el mismo problema con las transferencias de archivos. La velocidad que transfiere el archivo no es constante, se acelera y se ralentiza en función de muchos factores. La razón por la que el número salta tanto es porque Microsoft se inclinó hacia el lado "solo cuenta el último intervalo" del espectro.
No hay nada de malo en ese lado del espectro, le brinda "segundos por segundo" más precisos (un segundo en tiempo real hace que el contador baje un segundo), pero esto hace que la ETA total del temporizador salte mucho .
Un buen ejemplo del lado opuesto es 7-Zip cuando se está comprimiendo. Si la velocidad de la compresión disminuye a medida que se procesa, puede ver que el ETA no salta dramáticamente como un ETA de transferencia de archivos, pero puede tomar de 2 a 3 segundos reales antes de que el temporizador funcione un segundo (o incluso puede comenzar a contar ) hasta que se estabilice a la nueva velocidad.
fuente
En realidad, hay una respuesta casi canónica por parte de Raymond Chen de Microsoft sobre esto desde WAAAAAY, y hay algunas piezas en el rompecabezas.
En primer lugar, que Windows está adivinando. Sabe cuántos archivos y cuán grandes son, pero la velocidad de transferencia por archivo es muy variable. Depende de cosas como el tamaño, o incluso la ubicación en el disco en algunos casos. A medida que pasa el tiempo, está ajustando su estimación en función de las condiciones actuales y pasadas, y como tal tiene velocidades de transferencia estimadas inexactas en condiciones del mundo real.
fuente
Aquí está la explicación de Raymond Chen , ingeniero principal de diseño de software en Microsoft:
La publicación del blog citada anteriormente tiene una larga discusión sobre este tema, con algunos comentarios interesantes.
Raymond Chen es una persona legendaria, "Chuck Norris de Microsoft", no creo que vaya a obtener una respuesta más autorizada. Estoy seguro de que al menos había visto el código en cuestión.
fuente
La razón obvia es que la velocidad de la transferencia varía con el tiempo, y también lo hace el promedio, y también lo hace la predicción. Para explicar esto a un amigo no técnico, he usado una analogía que implica viajar en avión. Vas a volar sobre el Atlántico. Cuando llegue con un taxi al aeropuerto de salida, su ETA es de aproximadamente dos meses. Cuando desembarque en el aeropuerto de llegada, en función de su velocidad promedio hasta el momento, llegará a la casa de su amigo en 5 segundos.
Pero debe apreciar cuánto puede variar realmente la velocidad, incluso con lo que parece un escenario predecible, como copiar archivos dentro del mismo disco o entre dos discos locales. Una de las nuevas características que me gustan en Windows 8 es la capacidad de graficar la velocidad con el tiempo si hace clic en "más detalles". Si no tiene acceso a una máquina con Windows 8, busque imágenes para el cuadro de diálogo de copia de Windows 8 para obtener muchos ejemplos. Muchos de ellos son bastante planos, pero muchos de ellos también son inquietantemente accidentados, hasta el punto de que te preguntas si el disco duro es realmente saludable, cuando se hunde a cero.
Es probable que algunos de estos baches se deban a variaciones en el tamaño del archivo (los campos más pequeños producen más accesos, lo que ralentiza las cosas, especialmente en un disco duro mecánico que debe buscar moviendo su cabezal de lectura), pero algunos pueden ser simplemente un disco barato que se detiene en el más mínimo toque para evitar daños en los platos.
Hay mejores y peores algoritmos de predicción de ETA, pero para una predicción precisa, la computadora tendría que saberlo todo. El riesgo de intentar hacer que el algoritmo sea "inteligente" es que podría crear casos nuevos e imprevistos en los que es aún más hilarantemente incorrecto.
fuente
La única forma de saber cuánto tiempo llevará comprimir un conjunto de archivos es comprimirlos. A veces, la mejor suposición de Windows está cerca, a veces está muy mal. Lo mismo ocurre con la copia de grandes cantidades de archivos, como estoy seguro de que has notado.
No es tanto un error como una exhibición inútil de información rara vez precisa. La mejor manera de solucionarlo es cerrar los ojos. Ignoralo. ;-)
Quizás haya un programa que pueda copiar / comprimir archivos y hacer que suene una alarma cuando finalice. Eso sería realmente útil. Podríamos tomar una pequeña siesta mientras esperamos que Windows termine la limpieza de la casa.
fuente
Creo que la razón se explicó muy bien en uno de los comentarios de la publicación del blog vinculada por la respuesta de Roald:
La razón por la que da estimaciones tan horribles es que no está bien hecho. Obviamente, nunca puede ser 100% preciso, pero podría ser mucho, mucho mejor.
fuente
Para acelerar el proceso de copia (no gastar demasiado tiempo calculando estimaciones de tiempo en lugar de realizar operaciones relacionadas con la copia), la utilidad de copia de Windows integrada en el Explorador mantiene una cantidad limitada de información sobre la rapidez con que se completaron las operaciones de escritura anteriores. Cada vez que necesita calcular el tiempo restante, solo calcula la cantidad promedio de tiempo que las operaciones de escritura han estado tomando y luego se multiplica por el número de operaciones de escritura restantes.
El problema es que la cantidad de tiempo que lleva realizar una operación de escritura no es constante; en realidad, puede variar significativamente. Esto, a su vez, produce cambios significativos en la estimación del tiempo.
fuente
A
] y el número de puntos de datos utilizados para obtener ese promedio [n
]. Luego, para actualizarlo, es solo un caso de(A*n + [New value])/[n+1]
. Además, dado que las operaciones de copia casi siempre están vinculadas a IO y no a la CPU, un cálculo simple como ese cada pocos segundos no es nada. Por otro lado, mantener un promedio de las últimasn
escrituras requiere una matriz / cola / pila den
elementos, para que sepa qué valor se debe desalojar.Hay 3 factores a tener en cuenta:
Los números 1 y 3 parecen tener el efecto más obvio en el cálculo del tiempo de transferencia, pero muchas personas no tienen en cuenta el número 2. Esto puede tener un gran efecto sobre cuánto tiempo llevará la transferencia y es difícil de cuantificar.
Básicamente, cada vez que se escribe un archivo, el sistema de archivos necesita escribir un poco de metadatos sobre el archivo, por ejemplo. propiedad, permisos, tiempos de creación / modificación / acceso, etc. Dependiendo del sistema de archivos en particular, esta información puede escribirse en una parte del disco muy 'lejos' de donde se está escribiendo el archivo. Esta sobrecarga del sistema de archivos es lo que puede hacer que una transferencia aparentemente simple tarde mucho tiempo y / o haga que la estimación del tiempo fluctúe enormemente.
Por ejemplo: al transferir un archivo grande, notará que la estimación se mantiene estable y es bastante precisa, pero la transferencia de cientos de archivos de diferentes tamaños, pero el mismo tamaño total, puede llevar más tiempo y hacer que la estimación de tiempo se ajuste.
fuente
Hay tres deficiencias en los algoritmos de estimación actuales.
Contrariamente a la creencia popular, no son lo suficientemente difíciles como para levantar las manos.
La razón por la que la mayoría de las personas que escriben los blogs, y las personas aquí no son conscientes de la posibilidad, es lo mejor que puedo decir debido al campo de estudio y la amplitud de la educación. Un remedio modesto pero también muy cómodo debería ser posible para [un graduado con capacitación más reciente que los escritores de blogs] [una compañía multimillonaria] Microsoft.
Intentaré explicar a grandes rasgos por qué.
Los puntos de falla son los siguientes. El núcleo:
1. no puede predecir de manera confiable la carga de E / S futura debido a circunstancias fuera del alcance del núcleo
2. no rastrea la heurística IO en ningún nivel útil de detalle. La utilización es un concepto mucho más amplio que la velocidad de lectura / escritura de disco / red .
se necesita hacer muy poco al respecto, poco más que rastrear la información de uso de IO más básica
3. si fueran rastreados , no tendrían uso para la heurística
El punto de todo esto es que nuestro modelo es solo 2a = F * (bxc) + d complejo
Donde a, byc tienen 3 estados cada uno: el administrador de archivos mira los archivos (o solo los metadatos) antes de copiar, y F * (bxc) + d no es un cálculo costoso; si desea algo más preciso, use una tabla de búsqueda con más estados; casi no hay ningún cálculo.
nota: las dimensiones aquí son para un plato, serían diferentes con un SSD; principio / medio / final no importaría
La diferencia clave entre lo que describí y las implementaciones anteriores que hemos visto hasta ahora sería, en resumen, observar el tamaño del archivo y la distribución / entropía del archivo en el disco y usarlo para explicar [más] con precisión el elemento de tiempo del uso del disco.
(la patente se deja como ejercicio para el lector ...)
fuente
Hay muchas variables "desconocidas" cuando intentas predecir cuánto tiempo tomará algo. Por ejemplo, si bien el programa sabe que hay 3500 archivos y que los archivos ascienden a 3,5 GB (3500 MB), ¿eso significa que cada archivo tiene 1 MB? No necesariamente. Podría haber muchos archivos de 4 KB, y muchos archivos de 100 MB, y algunos otros en el medio. Además, debe tener en cuenta de dónde provienen los archivos y hacia dónde van (por ejemplo, los medios de comunicación). ¿Cuál es el mayor cuello de botella? ¿Cómo cuentas tratando de copiar archivos de un HDD a través de un túnel VPN ? Usted da el mejor escenario y luego ajusta sus contadores en tiempo real. Es por eso que ves que esos medidores de progreso cambian sobre la marcha.
fuente
El modelo matemáticamente correcto es hacer un promedio y una extrapolación ingenuos:
La razón es que, según la Ley de Grandes Números, las fluctuaciones locales se cancelarán en la velocidad de transferencia promedio , y esto le dará el resultado más estable.
Lo que Microsoft parece hacer es calcular la velocidad de transferencia en el último período de tiempo. Esto significa que cada fluctuación local cambia el resultado significativamente.
fuente
Como dijo Roald van Doorn, básicamente es solo adivinar. Por supuesto, eso no significa que no podría ser un mejor adivinador. Hay muchas heurísticas que podrían usarse para calcular esto.
Obviamente, nada de esto se implementa fácilmente ... y solo mencioné copias de archivos. Debería realizarse un trabajo similar para todo tipo de transferencias.
La pregunta que debe hacerse: ¿preferiría Microsoft pasar su tiempo dándole una mejor estimación o preferiría que hicieran que sus archivos se transfieran más rápido?
Sin embargo, si comprime algo con 7-zip, notará que es mucho mejor adivinar que Windows. Dudo que esté haciendo algo tan complicado, solo un adivinador un poco mejor.
fuente
En resumen, el cálculo se basa en la velocidad de transferencia actual .
Por ejemplo: si su velocidad de transferencia se hunde porque Windows tiene que copiar una gran cantidad de archivos pequeños, el tiempo esperado aumenta linealmente y viceversa para archivos grandes.
Es casi imposible predecir cuál será la velocidad de transferencia durante todo el proceso de transferencia, porque depende de muchos factores como el tamaño del archivo, el uso de la CPU, los errores de transmisión, etc.
fuente
Hay algunas respuestas interesantes en la publicación del blog de MSDN Mejorando nuestros conceptos básicos de administración de archivos: copie, mueva, cambie el nombre y elimine sobre esto. En cuanto a por qué es difícil:
Y cómo están mejorando,
Dicho esto, si realmente quieres mejorar solo la estimación dada y mantener la barra de progreso como está, puedes hacer algo sugerido en un comentario de Slashdot :
fuente
Solo quería agregar que el número total de archivos es fácilmente el factor que consume más tiempo de las operaciones de copia de archivos en una PC. Siempre puedo recordar como un joven estudiante, induciendo deliberadamente fallas de PC en mi clase de computación al comenzar con 1 archivo sin contenido, y copiarlo, luego seleccionar los 2 archivos y copiarlos de nuevo y así sucesivamente. Una vez que pasó más de 1024 archivos, comenzó a tomar una gran cantidad de tiempo para hacer cualquier cosa, incluso cuando no estaba copiando ninguna información, excepto el encabezado del archivo. Pruébelo usted mismo incluso en un nuevo sistema operativo, copia exponencial de archivos y verá lo que sucede. Comida para el pensamiento.
fuente
Acabo de copiar 200GB de USB HDD a mi disco principal. Había alrededor de 130000 archivos
Después de los primeros 4-5 minutos, observé que:
Al principio, Windows cambió la estimación de 1 hora a más de 5 horas, luego volvió a 1 hora y así sucesivamente. Al final, como en el 95%, todavía estaba cambiando la estimación de 10 minutos a más de 10 horas. Entonces, en lugar de volverse más preciso, iba cada vez menos preciso.
Espectáculos matemáticos simples:
130,000 archivos a 100 archivos por segundo = 22 minutos
200,000 MB a 70 MB por segundo = 47 minutos
22 minutos: perdido en el tiempo de búsqueda, copiando archivos de pocos kilobytes de tamaño. 47 minutos: el tiempo que necesitará para transferir los datos reales si no hay tiempo de búsqueda.
La suma de los 22min + 47min es el tiempo máximo absoluto que podría tomar.
Entonces, obviamente, la estimación debe estar entre 47 y 69 minutos.
Lo que el cuadro de diálogo muestra aproximadamente al 90%: "Estoy copiando algunos archivos pequeños a 1 MB / s, hay 20 GB más de datos, tardará 5:30 horas en completarse.
Pocos segundos después: "Estoy copiando un archivo grande aquí, a 70mb / s, tardará 4 minutos en completarse.
Lo que los humanos realmente ven desde el mismo diálogo: 120,000 archivos y 180GB ya están copiados por 40 minutos. El resto de 10000 archivos y 20 GB deberían tomar unos 5 minutos
El cuadro de diálogo proporciona información suficiente para realizar cálculos que se vuelven cada vez más precisos. Sabe a qué velocidad se copian los archivos pequeños. Sabe a qué velocidad se copian los archivos grandes. También sabe cuántos archivos y cuántos bytes quedan.
Es tan simple hacer una suposición tan precisa solo estableciendo el límite superior e inferior.
El cuadro de diálogo muestra datos un poco más correctos solo en caso de que los archivos grandes estén antes que los archivos pequeños. Si este es el caso, comienza a los 40 minutos, y después de 30 minutos comienza a copiar archivos pequeños y dice "bueno, necesito 20 minutos más".
Pero cuando los archivos pequeños al principio y los archivos grandes están al final. El diálogo en realidad no le importa a qué "archivos por segundo" transfiere los archivos pequeños. Hace su cálculo como si el recuento de archivos pequeños fuera infinito, y eso siempre será pequeño.
fuente