2010-08-03 9 views
18

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

¿Sería una cadena de archivos más rápida? ¿Qué tal una clase que descompone el archivo usando un hilo de trabajo, y lee un rango de bytes/escribe un rango de bytes [eso suena como una gran manera de corromper el archivo, pero la integridad no es prioridad 1 aquí, su velocidad :-) ]

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


Estas son 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 los promedios y sé que ellos pueden cambiar ligeramente en ejecuciones posteriores, pero Realmente pensé que habría una manera más rápida de copiar un archivo ya que asumí que Windows estaba haciendo comprobaciones adicionales de seguridad e integridad :-(

Todavía estoy esperando por eso Me buena respuesta (como 'oh sí, los archivos de más de 1,5 GB serán x más rápido si búfer m y desactivar la seguridad n') - está bien, sólo estoy deseando en este punto.

+11

Creo que sería difícil presionar para hacer una copia de archivo, más rápido que Windows, en un cuadro de Windows. –

+0

Supongo que su unidad es una unidad tradicional basada en platos. Si es así, dividir el archivo probablemente ralentizará las cosas debido a los tiempos de búsqueda. – Greg

+0

Copiar 1,6 GB a una nueva ubicación en la * misma * unidad no es una actividad que sea muy agradable para el disco duro. Tiene que saltar por todos lados para respaldar las lecturas y escrituras simulaneas. –

Respuesta

2

Supongo que windows copy, file.copy, Copyfile All usan las mismas llamadas subyacentes del sistema operativo para copiar. Dudo que todo lo que escriba supere las llamadas internas del sistema operativo.

5

Puede tratar de utilizar el hardware que ya tiene a su disposición, y asignar un gran búfer en la memoria. Al leer y escribir en trozos más grandes, es posible que pueda eliminar algunos de los gastos generales.

Sin embargo, no hay mucho por sobre que deshacerse, el cuello de la botella sigue siendo la E/S del disco. Esperaría en el mejor de los casos algo así como una reducción del 5% en el tiempo de ejecución.

7

Si está interesado en crear un enlace simbólico o hardlink en lugar de una copia actual, entonces las siguientes API de Windows pueden ser útiles.

+7

+1 La forma más rápida de mover la montaña es no mover la montaña en absoluto. ;> – dthorpe

+0

Qué ventaja daría SymbolicLink, estoy tratando de entender esto e hice una muestra con P/Invoke - si pruebo FileInfo ("symbolicFileName.txt"). Nombre devuelve el nombre, pero si intento File.Open ("symbolicFileName.txt", .....) dice que no puede encontrar el archivo. La información que encontré en SymbolicLink es bastante inútil en cuanto a explicar realmente qué es y cómo podría beneficiarme. Lo que REALMENTE quiero es un archivo para modificar, si todo está bien, reemplazar el original, estaba haciendo esto con File.Copy en ambos sentidos. – schmoopy

+2

@schmoopy: Esta respuesta no será útil para usted en ese caso. Los enlaces duros y simbólicos son básicamente punteros del sistema de archivos. Por lo tanto, si intenta modificar un archivo abierto desde un enlace físico, cambiará el contenido del archivo original. Siéntase libre de emitir un voto negativo sobre mi respuesta. Lo haría pero no puedes devolverte tu voto. Todavía podría ser útil mantener la respuesta; de lo contrario, simplemente la eliminaría. –

4

File.Copy hace una llamada a CreateFile en Kernel32.dll. Si estaba copiando muchos archivos pequeños (creo que millones) podría valer la pena hacer la P/Invocación para jugar con los parámetros y omitir las Demandas de Permiso. Un gran archivo 99.999% de los 2 minutos se gasta dentro del código del controlador.

1

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

Realice dos asignaciones de memoria, una para el archivo de entrada y otra para la salida, y mueva la memoria de una a la 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.

0

Creo que primero debe comprobar cuánto está fragmentado su disco. Si su archivo está en muchos pedazos y no tiene un gran espacio libre continuo para el segundo, entonces el disco debe mover la cabeza con mucha frecuencia, lo cual es muy lento.

Quizás su disco sea simple viejo y lento y alcance su máximo rendimiento. En ese caso, la solución es simple, necesita comprar una nueva, o mejor, dos y crear RAID 0.

También puede verificar si durante la copia algo más no utiliza el mismo disco, por ejemplo, antivirus o servicio 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.

1

para un solo archivo, ir a/desde la misma unidad, la respuesta a su pregunta es: sin.

Para transferencias de red, mover toneladas de archivos y otros escenarios más complejos, puede haber margen de mejora.

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.

0

Todo dependerá 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.

Cuestiones relacionadas