c#

c# - ¿Hay una manera más rápida de copiar un archivo que no sea File.Copy



(8)

Asumiría que Windows copy, file.copy, Copyfile All utilizan las mismas llamadas al sistema operativo subyacente para hacer la copia. Dudaría que cualquier cosa que escriba supere las llamadas internas del sistema operativo.

Se tarda unos 2 minutos para hacer un File.Copy(src, dest); para un archivo de 1.6GB de la carpeta A a la carpeta B en la misma unidad. ¿Hay una forma más rápida de hacer esto en C # / .NET en el código (sin hardware) - Algo con transmisión, subprocesos, etc.?

¿Sería más rápido un filestream? ¿Qué tal una clase que divide el archivo usando un grupo de subprocesos y lee un rango de bytes / escribe un rango de bytes [que suena como una gran manera de corromper el archivo, pero la integridad no es la prioridad 1 aquí, su velocidad :-) ]

He buscado pero todos dicen usar File.Copy, pero es lento (tan lento como Windows Copy): preferiría no usar una herramienta de terceros.

Aquí hay algunas respuestas a algunas de las preguntas:

Copia de comparación de tiempo:

> C# : 2.15m > Windows Explorer: 2.53m > TeraCopy: 2.26m > FastCopy: 2.24m

Ok, esos no son promedios y sé que pueden cambiar ligeramente en ejecuciones posteriores, pero realmente pensé que habría una forma más rápida de copiar un archivo, ya que asumí que Windows estaba haciendo comprobaciones de seguridad e integridad adicionales :-(

Todavía estoy esperando una buena respuesta (como ''oh sí, los archivos de más de 1.5GB serán x más rápidos si haces un búfer m y desactivas la seguridad n '') - ok, solo estoy deseando en este punto.


Creo que primero deberías comprobar cuánto está fragmentado tu disco. Si su archivo está en muchas partes y no tiene un gran espacio libre continuo para el segundo, entonces el disco debe moverse con mucha frecuencia, lo cual es muy lento.

Tal vez su disco sea simple, antiguo y lento, y usted alcance su máximo rendimiento. En ese caso, la solución es simple, necesita comprar uno nuevo o, mejor, dos y crear RAID 0.

También puede verificar si, durante la copia, otra cosa no utiliza el mismo disco, por ejemplo, un servicio antivirus o de indexación.

No propuse ninguna solución de software, porque no creo que haya nada más rápido que las funciones proporcionadas por el sistema operativo.


File.Copy realiza una llamada a CreateFile en Kernel32.dll. Si estuviera copiando montones y montones de archivos pequeños (piense en millones), valdría la pena hacer P / Invoke para jugar con los parámetros y omitir las Demandas de permisos. Un archivo grande 99.999% de los 2 minutos se gasta dentro del código del controlador.


No he intentado esto, pero podría ser rápido.

Realice dos asignaciones de memoria, una al archivo de entrada y otra a la salida, y mueva la memoria de una a otra. La asignación de páginas realizada por el sistema operativo se ajusta al rendimiento más alto posible, ya que afecta la velocidad general del sistema.


Para un solo archivo, yendo a / desde la misma unidad, la respuesta a su pregunta es: no .

Para las transferencias de red, la transferencia de toneladas de archivos y otros escenarios más complejos puede haber espacio para mejorar.

Si su requisito actual es copiar los GB a una segunda ubicación física (no simbólica) en el mismo disco, entonces su mejor oportunidad para mejorar el rendimiento es probablemente un disco más rápido.


Podría intentar usar el hardware que ya está a su disposición y asignar un búfer grande en la memoria. Al leer y escribir en trozos más grandes, es posible que pueda eliminar parte de la sobrecarga.

Sin embargo, no hay muchos gastos generales para eliminar, el cuello de la botella sigue siendo la E / S del disco. Yo esperaría en el mejor de los casos algo como una reducción del 5% en el tiempo de ejecución.


Si está interesado en crear un enlace simbólico o físico en lugar de una copia real , las siguientes API de Windows pueden ser útiles.


Todo depende de la asignación decidida por el sistema operativo en el momento de la copia, si el archivo está en caché (haga 5x de la misma manera para evitarlo).

El resultado más claro es si repite la prueba varias veces.