J'ai écrit un script bash au format suivant:
#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"
rm -f $inFile $outFile
while read line
do
-- Block of Commands
done < "$inFile"
end=$(date +%s)
runtime=$((end-start))
echo "Program has finished execution in $runtime seconds."
La while
boucle va lire $inFile
, effectuer une activité sur la ligne et vider le résultat $outFile
.
Comme la $inFile
longueur de 3500+ lignes, le script prendrait 6-7 heures pour s'exécuter complètement. Afin de minimiser ce temps, je prévois d'utiliser le multi-threading ou le forking dans ce script. Si je crée 8 processus enfants, 8 lignes du $inFile
seront traitées simultanément.
Comment cela peut-il être fait?
shell-script
multithreading
parallelism
Mandar Shinde
la source
la source
Réponses:
GNU
parallel
est fait pour ce genre de chose. Vous pouvez exécuter votre script plusieurs fois à la fois, avec des données différentes de votre entrée intégrées pour chacune:Par défaut, il générera des processus en fonction du nombre de processeurs sur votre système, mais vous pouvez le personnaliser avec
-j N
.Une astuce particulièrement intéressante est la fonction d'emballage de shebang. Si vous changez la première ligne de votre script Bash en:
et lui fournir des données sur une entrée standard, tout se fera automatiquement. Cela est moins utile lorsque vous avez du code de nettoyage qui doit s'exécuter à la fin, ce que vous pouvez faire.
Il y a deux ou trois choses à noter. La première est qu'il découpera votre entrée en morceaux séquentiels et les utilisera un par un - il n'entrelace pas les lignes. L'autre est que ces morceaux sont divisés par taille, sans tenir compte du nombre d'enregistrements. Vous pouvez utiliser
--block N
pour définir une taille de bloc différente en octets. Dans votre cas, pas plus d'un huitième de la taille du fichier devrait être à peu près correct. Votre fichier semble être assez petit pour finir dans un seul bloc, ce qui irait à l'encontre de l'objectif.Il existe de nombreuses options pour différents cas d'utilisation, mais le didacticiel couvre assez bien les choses. Les options qui pourraient également vous intéresser incluent
--round-robin
et--group
.la source
#!a b c
il en résultera["b c"]
, tandis que sur certains autres systèmes, il en résultera["b", "c"]
.GNU parallel
pour gratter des pages HTML. Pourriez-vous s'il vous plaît passer par ce fil unix.stackexchange.com/questions/277609/…