Tengo una lista de archivos que necesito copiar en un sistema Linux: cada archivo tiene un tamaño de 10 a 100 GB.
Solo quiero copiar al sistema de archivos local. ¿Hay alguna manera de hacer esto en paralelo, con múltiples procesos cada uno responsable de copiar un archivo, de una manera simple ?
Puedo escribir fácilmente un programa multiproceso para hacer esto, pero estoy interesado en averiguar si hay un método Linux de bajo nivel para hacerlo.
Respuestas:
Si su sistema no se ve afectado por él (por ejemplo, tal vez los archivos están en caché), entonces GNU Parallel http://www.gnu.org/software/parallel/ puede funcionar para usted:
Esto ejecutará 10
cp
s simultáneos .Pro: es simple de leer.
Con: GNU Parallel no es estándar en la mayoría de los sistemas, por lo que probablemente tenga que instalarlo.
Mire el video de introducción para obtener más información: http://www.youtube.com/watch?v=OpaiGYxkSuQ
Vea también https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ para una discusión sobre E / S de disco paralelo.
fuente
No existe un mecanismo de bajo nivel para esto por una razón muy simple: hacerlo destruirá el rendimiento de su sistema. Con las unidades de disco, cada escritura competirá por la colocación del cabezal, lo que dará lugar a una gran espera de E / S. Con los SSD, esto terminará saturando uno o más de los buses de su sistema, causando otros problemas.
fuente
Como se mencionó, esta es una idea terrible. Pero creo que todos deberían poder implementar sus propios planes horribles, así que ...
for FILE in *;do cp $FILE <destination> &;done
El asterisco se puede reemplazar con una expresión regular de sus archivos, o
$(cat <listfile>)
si los tiene todos en un documento de texto. El ampersand inicia un comando en segundo plano, por lo que el bucle continuará, generando más copias.Como se mencionó, esto aniquilará completamente su IO. Entonces ... Realmente no recomendaría hacerlo.
--Christopher Karel
fuente
La única respuesta que no destruirá la capacidad de respuesta de su máquina no es exactamente una 'copia', sino que es muy rápida. Si no va a editar los archivos en la ubicación nueva o antigua, entonces un enlace duro es efectivamente como una copia, y (solo) si está en el mismo sistema de archivos, se crean muy, muy, muy rápido.
Echa un vistazo
cp -l
y mira si funcionará para ti.fuente
Aquí hay una herramienta de copia de archivos distribuida / paralela y descentralizada que fragmentará el archivo y copiará todos los fragmentos en paralelo. Probablemente solo lo ayudará si tiene un SSD que admite múltiples transmisiones o algún tipo de configuración con múltiples cabezales de disco.
https://github.com/hpc/dcp
fuente
Para las personas que piensan que no es una gran idea, diría que depende. Puede tener un gran sistema de incursiones o un sistema de archivos paralelo que ofrecerá un rendimiento realmente mejor que el que puede manejar un proceso de cp. Entonces sí, debe usar una "herramienta paralela".
Tomemos este ejemplo:
luego esto
por lo que cada escritura de syscall realizada por "cp" en este caso es de 64 KB y durante 10 segundos en mi sistema puedo entregar este ancho de banda: 65536 * 166222/10 = 1089352499 = ~ 1,08 GB / s
Ahora, iniciemos esta carga de trabajo con 2 procesos (tengo 4 núcleos pero mi escritorio se usa para otras cosas, y aquí es solo un ejemplo):
Así que vemos que podemos casi duplicar el rendimiento usando 2 núcleos para lanzar esto.
Entonces, si estamos en un contexto diferente de 1xHard drive a 1xHard drive pero una matriz de incursión (o NVMe múltiple, así que no es el caso más común, estoy de acuerdo, pero trabajo en esto todos los días), muestra definitivamente un mejor rendimiento para usar múltiples comunes en paralela.
fuente
Deberías probar esto:
Esto copiará el archivo passwd 3 veces desde el directorio / etc / a su $ HOME
O si su archivo está en su directorio de inicio
Esto copiará el archivo passwd 3 veces en su $ HOME
fuente