On Thu, Feb 15, 2018 at 07:56:21AM +0100, Laurent Franceschetti wrote: > > Surtout quel est le problème que cette méthode résoud, et quelle est l’idée > centrale de la méthode?
Eliminer les ``forks'' répétitifs qui peuvent être évités. Petit exemple: Voici un fichier: $ wget http://f-hauri.ch/vrac/scTestFile.raw.gz scTestFile.raw.gz 100%[===================>] 12.14K --.-KB/s in 0.004s Qui contient des lignes (1000) de montants suivits de dates: $ zcat scTestFile.raw.gz | (head -n3;tail -n7) 2032.55 Jul 22 00:12:45 2007 6229.85 Apr 19 20:31:15 2010 3089.75 Sun Nov 2 08:48:10 2014 3816.30 Sat Nov 19 21:12:50 2016 7934.70 May 23 16:47:40 2008 2969.45 Aug 30 2017 01:43:45 3569.00 2011-12-29 17:07:20 594.40 Thu Mar 5 05:44:40 2015 9546.85 Dec 31 2015 06:56:45 3445.75 2016-07-14 18:43:15 Pour - unifier la présentation des dates et - calculer le total des montants, je peux: $ tot=0.0 $ time while read val date;do tot=$(bc -l <<<"$tot+$val") printf "%11.2f %(%a %d %b %Y %T)T\n" $val $( date -d "$date" +%s ) done < <(zcat scTestFile.raw.gz) > >(head -n3;tail -n7) 2032.55 dim 22 jui 2007 00:12:45 6229.85 lun 19 avr 2010 20:31:15 3089.75 dim 02 nov 2014 08:48:10 3816.30 sam 19 nov 2016 21:12:50 7934.70 ven 23 mai 2008 16:47:40 2969.45 mer 30 aoû 2017 01:43:45 3569.00 jeu 29 déc 2011 17:07:20 594.40 jeu 05 mar 2015 05:44:40 9546.85 jeu 31 déc 2015 06:56:45 3445.75 jeu 14 jui 2016 18:43:15 real 2m0.433s user 0m20.960s sys 0m24.550s Euh oui, je l'ai fait sur un raspberry-pi... 2 minutes! $ echo $tot 4674781.85 Bon, à présent voyons: $ wget https://f-hauri.ch/vrac/shell_connector.sh shell_connector.sh 100%[===================>] 7.93K --.-KB/s in 0.005s $ . shell_connector.sh $ newConnector /usr/bin/bc -l 0 0 $ newConnector /bin/date '-f - +%s' @0 0 $ echo >&$BCIN tot=0 Oui, je stoque la variable tot dans `bc`... $ time while read val date ;do echo >&$BCIN tot=tot+$val myDate "$date" mDate printf "%11.2f %(%a %d %b %Y %T)T\n" $val $mDate done < <(zcat scTestFile.raw.gz) > >(head -n3;tail -n7) 2032.55 dim 22 jui 2007 00:12:45 6229.85 lun 19 avr 2010 20:31:15 3089.75 dim 02 nov 2014 08:48:10 3816.30 sam 19 nov 2016 21:12:50 7934.70 ven 23 mai 2008 16:47:40 2969.45 mer 30 aoû 2017 01:43:45 3569.00 jeu 29 déc 2011 17:07:20 594.40 jeu 05 mar 2015 05:44:40 9546.85 jeu 31 déc 2015 06:56:45 3445.75 jeu 14 jui 2016 18:43:15 real 0m8.043s user 0m2.370s sys 0m0.800s Voilà, en évitant ~2000 forks, je le fais en 8" au lieu de 120"! $ myBc tot montotal $ echo $montotal 4674781.85 Tant que mon shell courant existe et que je ne ferme pas les descripteurs, je peux continuer à les utiliser... $ ps --sid $(ps ho sid $$) fw PID TTY STAT TIME COMMAND 4625 pts/2 Ss 0:00 -bash 9146 pts/2 S 0:00 \_ /usr/bin/bc -l 9150 pts/2 S 0:00 \_ /bin/date -f - +%s 9188 pts/2 R+ 0:00 \_ ps --sid 4625 fw Voilà, j'espère avoir montré l'intérêt de la méthode. Bonne soirée! -- Félix Hauri - <[email protected]> - http://www.f-hauri.ch _______________________________________________ gull mailing list [email protected] http://forum.linux-gull.ch/mailman/listinfo/gull
