Copiando en dos carpetas diferentes en una máquina simultáneamente -- performance campo con file-system campo con bash campo con linux campo con concurrency camp codereview Relacionados El problema

Copying into two different folders on a machine simultaneously


4
vote

problema

Español

Estoy tratando de copiar archivos de machineB machineC5 en machineA como estoy ejecutando mi script shell en machineA .

Si los archivos no están en machineB , entonces debe estar allí en machineC seguro. Intentaré copiar los archivos de for .. in0 primero, y si no está en for .. in1 , intentaré copiar los mismos archivos de for .. in2 .

Estoy copiando los archivos en paralelo con GNU Parallel Library y está funcionando bien. Actualmente estoy copiando dos archivos en paralelo.

Anteriormente, estaba copiando el for .. in3 archivos en for .. in4 con GNU paralelo y una vez que se realizó. Luego estaba copiando el for .. in5 en la carpeta for .. in6 en paralelo para que sea secuencial a partir de ahora, con respecto al for .. in7 y < Código> for .. in8 Carpetas.

Ahora decidí copiar archivos en for .. in9 y 99887766555443320 simultáneamente.

  function Map() {     this.x;     this.y; }  Map.prototype = {     move:function() {         var new_x = this.x - 1;         var new_y = this.y - 1;         Map.prototype.render(new_x, new_y);     },     render:function(p_x,p_y) {         //check for map boundaries         var max_divs = 2;         if(!p_x) p_x = 1;         if(!p_y) p_y = 1;         if(p_x >= 99) p_x--;         if(p_y >= 99) p_y--;          divs_x = max_divs + p_x;         divs_y = max_divs + p_y;         //create new table         var root = document.createElement("table");         root.id = 'root_table';         //loop coordinates and generate surrounding cells         for (var x = p_x; x <= divs_x; x++) {             var row = document.createElement("tr");             for (var y = p_y; y <= divs_y; y++) {                 var cell = document.createElement("td");                 if (x <= 0 || y <= 0 || x >= 101 || y >= 101) {                     cell.textContent = "";                 }                 else {                     this.x = x; this.y = y;                     cell.textContent = "("+this.x+","+this.y+")";                     //add event handler for the click event (move)                     cell.addEventListener("click", this.move, false);                     cell.x = x; cell.y = y;                     cell.className = 'map';                 }                 //add cell to row                 row.appendChild(cell);             }             //add row to table             root.appendChild(row);         }         var main = document.getElementById("container");         var old_table = document.getElementById('root_table')         if(old_table) main.removeChild(old_table);          //remove old table, add new one         main.appendChild(root);     } }  var map = new Map(); map.render(); 1  

El script está funcionando bien para mí, pero estoy tratando de ver si hay una mejor manera de hacer lo mismo utilizando GNU paralelo en lugar de usar function Map() { this.x; this.y; } Map.prototype = { move:function() { var new_x = this.x - 1; var new_y = this.y - 1; Map.prototype.render(new_x, new_y); }, render:function(p_x,p_y) { //check for map boundaries var max_divs = 2; if(!p_x) p_x = 1; if(!p_y) p_y = 1; if(p_x >= 99) p_x--; if(p_y >= 99) p_y--; divs_x = max_divs + p_x; divs_y = max_divs + p_y; //create new table var root = document.createElement("table"); root.id = 'root_table'; //loop coordinates and generate surrounding cells for (var x = p_x; x <= divs_x; x++) { var row = document.createElement("tr"); for (var y = p_y; y <= divs_y; y++) { var cell = document.createElement("td"); if (x <= 0 || y <= 0 || x >= 101 || y >= 101) { cell.textContent = ""; } else { this.x = x; this.y = y; cell.textContent = "("+this.x+","+this.y+")"; //add event handler for the click event (move) cell.addEventListener("click", this.move, false); cell.x = x; cell.y = y; cell.className = 'map'; } //add cell to row row.appendChild(cell); } //add row to table root.appendChild(row); } var main = document.getElementById("container"); var old_table = document.getElementById('root_table') if(old_table) main.removeChild(old_table); //remove old table, add new one main.appendChild(root); } } var map = new Map(); map.render(); 2 .

Original en ingles

I am trying to copy files from machineB and machineC into machineA as I am running my shell script on machineA.

If the files are not in machineB, then it should be there in machineC for sure. I will try copying the files from machineB first, and if it is not in machineB, then I will try copying the same files from machineC.

I am copying the files in parallel using GNU parallel library and it is working fine. I am currently copying two files in parallel.

Earlier, I was copying the PRIMARY_PARTITION files in PRIMARY folder using GNU parallel and once that was done. I was then copying the SECONDARY_PARTITION files in the SECONDARY folder using same GNU parallel so it is sequential as of now with regards to the PRIMARY and SECONDARY folders.

Now I decided to copy files in PRIMARY and SECONDARY folder simultaneously.

#!/bin/bash  export PRIMARY=/test01/primary export SECONDARY=/test02/secondary readonly FILERS_LOCATION=(machineB machineC) export FILERS_LOCATION_1=${FILERS_LOCATION[0]} export FILERS_LOCATION_2=${FILERS_LOCATION[1]} PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers  export dir3=/testing/snapshot/20140103  do_Copy() {   el=$1   PRIMSEC=$2   scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. } export -f do_Copy  parallel --retries 10 -j 5 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" & parallel --retries 10 -j 5 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" & wait  echo "All files copied." 

The script is working fine for me, but I am trying to see is there any better way of doing the same thing using GNU Parallel instead of using &.

              

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Estoy tratando de ver si hay una mejor manera de hacer lo mismo usando GNU paralelo en lugar de usar & .

Esencialmente, tiene dos comandos diferentes y dos listas de parámetros diferentes:

  1. Copiar en primario, estos archivos: 550 274 ​​2 546 278
  2. Copiar a Secundary, estos archivos: 1643 1103 1372 1096 1369 1568

Estos son dos conjuntos de archivos, dos operaciones distintas. No creo que haya una forma fácil de hacer esto con un proceso único 9988776665544331 . Una forma no tan fácil puede ser: Organice las entradas en parejas, como esta:

  parallel -N2 do_Copy {1} {2} ::: 550 $PRIMARY 274 $PRIMARY 1643 $SECONDARY  # and so on   

De esta manera, funcionará con un comando. Pero construir la lista de argumentos dinámicamente de su lista de nombres de archivos será complicada y potencialmente propensa. La solución original es simple y más fácil de entender, que son propiedades preferibles.

Variables exportadoras

No necesita exportar PRIMARY y SECONDARY .

Solo necesita exportar FILERS_LOCATION_1 y FILERS_LOCATION_2 , Debido a que estos serán utilizados por do_Copy , que se llamará mediante parallel (y también debe ser exportado, como lo hizo correctamente).

Observe que la matriz de solo lectura 9988776655544339 es inútil. Puede configurar al igual que las variables parallel0 directamente:

  parallel1  

Mejora parallel2

En este método, Tienes dos comandos parallel3 que son casi duplicados, excepto la parte de destino. Para evitar la duplicación, Usted podría simplemente hacer unir los posibles destinos, y salga del bucle tan pronto como una copia fue exitosa:

  parallel4  

Si los archivos de destino pueden ser exactamente los mismos que los archivos locales, Luego, estará mejor al usar parallel5 en lugar de parallel6 , Para evitar transferencias de archivos innecesarios.

 

I am trying to see is there any better way of doing the same thing using GNU Parallel instead of using &.

Essentially you have two different commands and two different parameter lists:

  1. Copy to PRIMARY, these files: 550 274 2 546 278
  2. Copy to SECONDARY, these files: 1643 1103 1372 1096 1369 1568

These are two file-sets, two distinct operations. I don't think there's an easy way to do this with a single parallel process. A not-so-easy way can be: organize the inputs in pairs, like this:

parallel -N2 do_Copy {1} {2} ::: 550 $PRIMARY 274 $PRIMARY 1643 $SECONDARY  # and so on 

This way it will work with one command. But constructing the argument list dynamically from your list of filenames will be tricky and potentially error prone. The original solution is simple and easier to understand, which are preferable properties.

Exporting variables

You don't need to export PRIMARY and SECONDARY.

You only need to export FILERS_LOCATION_1 and FILERS_LOCATION_2, because these will be used by do_Copy, which will be called by parallel (and also needs to be exported, as you correctly did).

Notice that the read-only FILERS_LOCATION array is pointless. You could just as well set the FILERS_LOCATION_* variables directly:

export FILERS_LOCATION_1=machineB export FILERS_LOCATION_2=machineC 

Improving do_Copy

In this method, you have two scp commands that are almost duplicates, except the destination part. To avoid the duplication, you could just loop over the possible destinations, and break out of the loop as soon as a copy was successful:

do_Copy() {   el=$1   PRIMSEC=$2   for host in $FILERS_LOCATION_1 $FILERS_LOCATION_2; do       echo "scp david@$host:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/." && break   done } 

If the destination files might be exactly the same as the local files, then you'll be better off using rsync -u instead of scp, to avoid unnecessary file transfers.

 
 

Relacionados problema

3  SPSC espera un tampón de anillo libre para mensajes entrantes  ( Spsc wait free ring buffer for incoming messages ) 
Esto es para un solo productor y un solo tampón de anillo de espera libre de consumidores. Las escrituras necesitan ser esperadas por supuesto. Pre-asigna las...

2  Método de actualización de bloqueo de reentrantreadwritelock  ( Reentrantreadwritelock lock upgrade method ) 
Tengo una pregunta sobre la actualización de bloqueo. Específicamente lo que me molesta está entre readlock.unlock () y siguiendo a writelock.lock () ... Esto...

12  Entrevista de concurrencia  ( Concurrency interview ) 
Un poco de vuelta, tuve una entrevista donde plantearon un problema, en resumen: Mire un determinado directorio, y procese archivos JSON entrantes Estos ...

7  Descarga concurrente en Go  ( Concurrent download in go ) 
Escribí un programa para descargar archivos en manera concurrente / paralelo (gomaxprocs & gt; 1). Este es mi programa 2 nd (no juguete) escrito en Go. Po...

3  Implementando una fábrica segura de hilo con almacenamiento en caché  ( Implementing a thread safe factory with caching ) 
Tengo un 9988776655544330 que crea Connector Objetos basados ​​en parámetros como URL, nombre de usuario y contraseñas. El Connector2 El objeto implem...

4  Cola de tareas paralelas que se ejecuta en secuencia  ( Parallel task queue that runs in sequence ) 
Necesito una solución que ejecute solicitudes entrantes constantemente en una secuencia por recurso, pero paralela en general. El caso de uso: Muchos clie...

4  Pruebe una actualización especulativa, concurrente, libre de bloqueo y atómica hasta que las coincidencias de la condición de aburtar  ( Try a speculative concurrent lock free atomic update until abort condition ma ) 
Por favor, hágamelo saber si ve las mejoras de rendimiento, errores o cualquier cosa que cambie y por qué. public static bool TrySpeculativeUpdate(ref ...

6  Al leer simultáneamente un mapa, mientras que un solo hilo de fondo lo modifica regularmente  ( Concurrently reading a map while a single background thread regularly modifies i ) 
Tengo una clase en la que estoy poblando un mapa liveSocketsByDatacenter desde una sola hilo de fondo cada 30 segundos dentro 9988777665544334 y luego ten...

3  Diseño de reutilización de la piscina de hilo con Ejecutors.NewFixedThreadPool en Java  ( Design of thread pool reuse with executors newfixedthreadpool in java ) 
En mi solicitud, tengo código que debería ejecutarse cada hora en un nuevo elemento y ejecutar una operación costosa con MultiPhreading: |2 Mis pregunt...

5  Herramienta para calcular el tiempo promedio que toma para una solicitud de tracción GitHub para fusionar  ( Tool to calculate the average time that takes for a github pull request to get m ) 
Estoy aprendiendo, y este es mi primer intento de una herramienta de línea de comandos que usa la API de GitHub para calcular el tiempo promedio que toma una ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos