2010-11-26 10 views
3

Ich habe eine Frage mit der Geschwindigkeit. Ich habe ein Bash-Skript, das Informationen von TheTvDb.com analysiert. Es lädt fast 40.000 Datenzeilen herunter und reduziert sie dann auf etwa 5000 Datenzeilen, die auf die Festplatte geschrieben werden. Dann liest es die Datei und parst sie in mehrere Dateien, die später als Nachschlagetabelle verwendet werden. Es nimmt im Grunde genommen alle Informationen, die es vor jedem "/ Episode" sieht, in eine bestimmte Datei und schreibt dann auf den nächsten zurück.Schnellere Textverarbeitung in BASH

Es muss auf dem "/ Episode" -Tag synchronisiert werden, da es ein "FirstAired" -Tag außerhalb der Episodentags gibt. Dies stellt sicher, dass die Daten in Folge und nicht in Abhängigkeit von jedem einzelnen Tag, das sich auf eine Episode bezieht, gezeichnet werden.

Hier ist der Code in Frage.

if [ -f "$mythicalLibrarian/$NewShowName/$NewShowName.xml" ]; then 
    Ename="" 
    actualEname="" 
    FAired="" 
    SeasonNr="" 
    EpisodeNr="" 
    recordNumber=0 

    echo "Parsing Downloaded information: $NewShowName.xml " 
    while read line 
    do 

    if [[ $line == \<\/Episode\> ]]; then 
     ((++recordNumber)) 
     echo -ne "Building Record:$recordNumber ${actualEname:0:20}   \r" 1>&2 
    echo "$actualEname" >> "$mythicalLibrarian/$NewShowName/$NewShowName.actualEname.txt"& 
     Ename=`echo "$actualEname" |sed 's/;.*//'` 
    echo "$Ename" >> "$mythicalLibrarian/$NewShowName/$NewShowName.Ename.txt"& 
    echo "$FAired" >> "$mythicalLibrarian/$NewShowName/$NewShowName.FAired.txt"& 
    echo "$SeasonNr" >> "$mythicalLibrarian/$NewShowName/$NewShowName.S.txt"& 
    echo "$EpisodeNr" >> "$mythicalLibrarian/$NewShowName/$NewShowName.E.txt"& 
    Ename="" 
    actualEname="" 
    FAired="" 
    SeasonNr="" 
    EpisodeNr="" 

#Get actual show name 
    elif [[ $line == \<EpisodeName\>* ]]; then 
     actualEname=`echo "$line" | sed -e s/'<\/EpisodeName>'// -e s/'<EpisodeName>'// -e s/'\&amp\;'/'\&'/ -e s/'\&quot\;'/'\"'/ -e s/'\&amp\;'/'\&'/ -e s/'\&ndash\;'/'-'/ -e s/'\&lt\;'/'\<'/ -e 's/'\&gt\;'/'\>'/' |tr -d '|\?\*\<\"\:\>\+\\\[\]\/'` 


#Get OriginalAirDate 
    elif [[ $line == \<FirstAired\>* ]]; then 
     FAired=`echo "$line" | sed -e s/'<FirstAired>'//g -e s/'<\/FirstAired>'//g` 

#Get Season number 
    elif [[ $line == \<SeasonNumber\>* ]]; then 
     SeasonNr=`echo "$line" |sed -e s/'<SeasonNumber>'// -e s/'<\/SeasonNumber>'//` 

#Get Episode number 
    elif [[ $line == \<EpisodeNumber\>* ]]; then 
     EpisodeNr=`echo "$line" |sed -e 's/<EpisodeNumber>//' -e 's/<\/EpisodeNumber>//'` 

    fi 
    done < "$mythicalLibrarian/$NewShowName/$NewShowName.xml" 


    chmod 777 "$mythicalLibrarian"/"$NewShowName"/"$NewShowName".actualEname.txt 
    chmod 666 "$mythicalLibrarian"/"$NewShowName"/"$NewShowName".Ename.txt 
    chmod 666 "$mythicalLibrarian/$NewShowName/$NewShowName".FAired.txt 
    chmod 666 "$mythicalLibrarian"/"$NewShowName"/"$NewShowName".S.txt 
    chmod 666 "$mythicalLibrarian/$NewShowName/$NewShowName".E.txt 
    GotNewInformation=1 


    elif [ ! -f "$mythicalLibrarian/$NewShowName/$NewShowName.xml" ]; then 
    echo "COULD NOT DOWNLOAD:www.thetvdb.com/api/$APIkey/series/$SeriesID/all/$Language.xml">>"$mythicalLibrarian"/output.log 
    fi 

Hier ist ein Teil der Daten wird die Verarbeitung

<?xml version="1.0" encoding="UTF-8" ?> 
<Data><Series> 
    <Actors>|Fred Rogers|Adair Roth|Bert Lloyd|Bud Alder|Carol Saunders|Carole Switala|Deborah Neal Stampo|Don Brockett|Elsie Neal|Emilie Jacobson|Fred Michael|John Reardon|Jos|Judy Rubin|Keith David|Lenny Meledandri|Michael Horton|Robert Trow|Yoshi Ito|</Actors> 
    <Airs_DayOfWeek></Airs_DayOfWeek> 
    <Airs_Time></Airs_Time> 
    <ContentRating></ContentRating> 
    <FirstAired>1968-02-01</FirstAired> 
    <Genre>|Children|</Genre> 
    <Network>PBS</Network> 
    <NetworkID></NetworkID> 
    <Overview>&quot;In a little toy neighborhood, a tiny trolley rolls past a house at the end of a street. 

    <Runtime>30</Runtime> 
    <SeriesID>6843</SeriesID> 
    <SeriesName>Mister Rogers' Neighborhood</SeriesName> 
    <Status>Ended</Status> 
    <added></added> 
    <addedBy></addedBy> 
    <banner>graphical/77750-g.jpg</banner> 
    <fanart>fanart/original/77750-1.jpg</fanart> 
    <poster></poster> 
    <zap2it_id>SH002930</zap2it_id> 
</Series> 
<Episode> 
    <EpisodeName>Change (1)</EpisodeName> 
    <EpisodeNumber>1</EpisodeNumber> 
    <FirstAired>1968-02-19</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Change (2)</EpisodeName> 
    <EpisodeNumber>2</EpisodeNumber> 
    <FirstAired>1968-02-20</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Change (3)</EpisodeName> 
    <EpisodeNumber>3</EpisodeNumber> 
    <FirstAired>1968-02-21</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Change (4)</EpisodeName> 
    <EpisodeNumber>4</EpisodeNumber> 
    <FirstAired>1968-02-22</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Change (5)</EpisodeName> 
    <EpisodeNumber>5</EpisodeNumber> 
    <FirstAired>1968-02-23</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 6</EpisodeName> 
    <EpisodeNumber>6</EpisodeNumber> 
    <FirstAired>1968-02-26</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 7</EpisodeName> 
    <EpisodeNumber>7</EpisodeNumber> 
    <FirstAired>1968-02-27</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 8</EpisodeName> 
    <EpisodeNumber>8</EpisodeNumber> 
    <FirstAired>1968-02-28</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 9</EpisodeName> 
    <EpisodeNumber>9</EpisodeNumber> 
    <FirstAired>1968-02-29</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 10</EpisodeName> 
    <EpisodeNumber>10</EpisodeNumber> 
    <FirstAired>1968-03-01</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 11</EpisodeName> 
    <EpisodeNumber>11</EpisodeNumber> 
    <FirstAired>1968-03-04</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 12</EpisodeName> 
    <EpisodeNumber>12</EpisodeNumber> 
    <FirstAired>1968-03-05</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 13</EpisodeName> 
    <EpisodeNumber>13</EpisodeNumber> 
    <FirstAired>1968-03-06</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 14</EpisodeName> 
    <EpisodeNumber>14</EpisodeNumber> 
    <FirstAired>1968-03-07</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 15</EpisodeName> 
    <EpisodeNumber>15</EpisodeNumber> 
    <FirstAired>1968-03-08</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Welcome Donkey Hodie (1)</EpisodeName> 
    <EpisodeNumber>16</EpisodeNumber> 
    <FirstAired>1968-03-11</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Welcome Donkey Hodie (2)</EpisodeName> 
    <EpisodeNumber>17</EpisodeNumber> 
    <FirstAired>1968-03-12</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Welcome Donkey Hodie (3)</EpisodeName> 
    <EpisodeNumber>18</EpisodeNumber> 
    <FirstAired>1968-03-13</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Welcome Donkey Hodie (4)</EpisodeName> 
    <EpisodeNumber>19</EpisodeNumber> 
    <FirstAired>1968-03-14</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Welcome Donkey Hodie (5)</EpisodeName> 
    <EpisodeNumber>20</EpisodeNumber> 
    <FirstAired>1968-03-15</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 21</EpisodeName> 
    <EpisodeNumber>21</EpisodeNumber> 
    <FirstAired>1968-03-18</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 22</EpisodeName> 
    <EpisodeNumber>22</EpisodeNumber> 
    <FirstAired>1968-03-19</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 23</EpisodeName> 
    <EpisodeNumber>23</EpisodeNumber> 
    <FirstAired>1968-03-20</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 24</EpisodeName> 
    <EpisodeNumber>24</EpisodeNumber> 
    <FirstAired>1968-03-21</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 25</EpisodeName> 
    <EpisodeNumber>25</EpisodeNumber> 
    <FirstAired>1968-03-22</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 26</EpisodeName> 
    <EpisodeNumber>26</EpisodeNumber> 
    <FirstAired>1968-03-25</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 27</EpisodeName> 
    <EpisodeNumber>27</EpisodeNumber> 
    <FirstAired>1968-03-26</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 28</EpisodeName> 
    <EpisodeNumber>28</EpisodeNumber> 
    <FirstAired>1968-03-27</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 29</EpisodeName> 
    <EpisodeNumber>29</EpisodeNumber> 
    <FirstAired>1968-03-28</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 30</EpisodeName> 
    <EpisodeNumber>30</EpisodeNumber> 
    <FirstAired>1968-03-29</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Red Monster (1)</EpisodeName> 
    <EpisodeNumber>31</EpisodeNumber> 
    <FirstAired>1968-04-01</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Red Monster (2)</EpisodeName> 
    <EpisodeNumber>32</EpisodeNumber> 
    <FirstAired>1968-04-02</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Red Monster (3)</EpisodeName> 
    <EpisodeNumber>33</EpisodeNumber> 
    <FirstAired>1968-04-03</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Red Monster (4)</EpisodeName> 
    <EpisodeNumber>34</EpisodeNumber> 
    <FirstAired>1968-04-04</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Red Monster (5)</EpisodeName> 
    <EpisodeNumber>35</EpisodeNumber> 
    <FirstAired>1968-04-05</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 36</EpisodeName> 
    <EpisodeNumber>36</EpisodeNumber> 
    <FirstAired>1968-04-08</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 37</EpisodeName> 
    <EpisodeNumber>37</EpisodeNumber> 
    <FirstAired>1968-04-09</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 38</EpisodeName> 
    <EpisodeNumber>38</EpisodeNumber> 
    <FirstAired>1968-04-10</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 39</EpisodeName> 
    <EpisodeNumber>39</EpisodeNumber> 
    <FirstAired>1968-04-11</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 40</EpisodeName> 
    <EpisodeNumber>40</EpisodeNumber> 
    <FirstAired>1968-04-12</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 41</EpisodeName> 
    <EpisodeNumber>41</EpisodeNumber> 
    <FirstAired>1968-04-15</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 42</EpisodeName> 
    <EpisodeNumber>42</EpisodeNumber> 
    <FirstAired>1968-04-16</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 43</EpisodeName> 
    <EpisodeNumber>43</EpisodeNumber> 
    <FirstAired>1968-04-17</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 44</EpisodeName> 
    <EpisodeNumber>44</EpisodeNumber> 
    <FirstAired>1968-04-18</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 45</EpisodeName> 
    <EpisodeNumber>45</EpisodeNumber> 
    <FirstAired>1968-04-19</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 46</EpisodeName> 
    <EpisodeNumber>46</EpisodeNumber> 
    <FirstAired>1968-04-22</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 47</EpisodeName> 
    <EpisodeNumber>47</EpisodeNumber> 
    <FirstAired>1968-04-23</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 48</EpisodeName> 
    <EpisodeNumber>48</EpisodeNumber> 
    <FirstAired>1968-04-24</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 49</EpisodeName> 
    <EpisodeNumber>49</EpisodeNumber> 
    <FirstAired>1968-04-25</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 50</EpisodeName> 
    <EpisodeNumber>50</EpisodeNumber> 
    <FirstAired>1968-04-26</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 51</EpisodeName> 
    <EpisodeNumber>51</EpisodeNumber> 
    <FirstAired>1968-04-29</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 52</EpisodeName> 
    <EpisodeNumber>52</EpisodeNumber> 
    <FirstAired>1968-04-30</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 53</EpisodeName> 
    <EpisodeNumber>53</EpisodeNumber> 
    <FirstAired>1968-05-01</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 54</EpisodeName> 
    <EpisodeNumber>54</EpisodeNumber> 
    <FirstAired>1968-05-02</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 55</EpisodeName> 
    <EpisodeNumber>55</EpisodeNumber> 
    <FirstAired>1968-05-03</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 56</EpisodeName> 
    <EpisodeNumber>56</EpisodeNumber> 
    <FirstAired>1968-05-06</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 57</EpisodeName> 
    <EpisodeNumber>57</EpisodeNumber> 
    <FirstAired>1968-05-07</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 58</EpisodeName> 
    <EpisodeNumber>58</EpisodeNumber> 
    <FirstAired>1968-05-08</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 59</EpisodeName> 
    <EpisodeNumber>59</EpisodeNumber> 
    <FirstAired>1968-05-09</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 60</EpisodeName> 
    <EpisodeNumber>60</EpisodeNumber> 
    <FirstAired>1968-05-10</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 61</EpisodeName> 
    <EpisodeNumber>61</EpisodeNumber> 
    <FirstAired>1968-05-13</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 62</EpisodeName> 
    <EpisodeNumber>62</EpisodeNumber> 
    <FirstAired>1968-05-14</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 63</EpisodeName> 
    <EpisodeNumber>63</EpisodeNumber> 
    <FirstAired>1968-05-15</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 64</EpisodeName> 
    <EpisodeNumber>64</EpisodeNumber> 
    <FirstAired>1968-05-16</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 65</EpisodeName> 
    <EpisodeNumber>65</EpisodeNumber> 
    <FirstAired>1968-05-17</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 66</EpisodeName> 
    <EpisodeNumber>66</EpisodeNumber> 
    <FirstAired>1968-05-20</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 67</EpisodeName> 
    <EpisodeNumber>67</EpisodeNumber> 
    <FirstAired>1968-05-21</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 68</EpisodeName> 
    <EpisodeNumber>68</EpisodeNumber> 
    <FirstAired>1968-05-22</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 69</EpisodeName> 
    <EpisodeNumber>69</EpisodeNumber> 
    <FirstAired>1968-05-23</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 70</EpisodeName> 
    <EpisodeNumber>70</EpisodeNumber> 
    <FirstAired>1968-05-24</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 71</EpisodeName> 
    <EpisodeNumber>71</EpisodeNumber> 
    <FirstAired>1968-05-27</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 
<Episode> 
    <EpisodeName>Show 72</EpisodeName> 
    <EpisodeNumber>72</EpisodeNumber> 
    <FirstAired>1968-05-28</FirstAired> 
    <SeasonNumber>1</SeasonNumber> 
</Episode> 

Das Problem besteht darin, dass dies dauert 14,5 Sekunden auf einem i7-Prozessor. Es ist ungefähr 10x langsamer auf meinem Media Center. Ich habe versucht, eine case-Anweisung zu verwenden, die 15 Sekunden auf dem schnellen Prozessor dauert.

Ich würde gerne wissen, wie man diesen Prozess beschleunigen kann. Es scheint, dass dies für BASH lächerlich langsam ist, das um Datenmanipulation und Dateioperationen herum entwickelt werden soll.

Antwort

4

Sie werden eine erhebliche Beschleunigung erhalten, indem Sie die & vom Ende all dieser echo Aussagen fallen lassen.

Test1:

$ time { for i in {1..1000}; do echo "hello"& done >/dev/null; } | cat 

real 0m10.357s 
user 0m2.764s 
sys  0m15.441s 

Die cat frisst die "done" Nachrichten, wenn diese in der Befehlszeile ausgeführt wird. Ein Doppelpunkt könnte anstelle von cat verwendet werden, um die "fertig" -Meldungen vom ersten zeitgesteuerten Test zu unterdrücken. Es ist nicht das Programm, das es tut, sondern die Tatsache, dass die Hintergrundprozesse Teil einer Pipe sind.

Test2:

$ time { for i in {1..1000}; do echo "hello"; done >/dev/null; } 

real 0m0.152s 
user 0m0.132s 
sys  0m0.020s 

Beachten Sie, dass dies auf eine sehr langsame, alte Maschine war.

Sie können auch eine Geschwindigkeitsverbesserung erzielen, indem Sie die Regex- und String-Verarbeitungsfunktionen von Bash verwenden, anstatt wiederholt mehrere externe Dienstprogramme in einer Schleife zu generieren.

Beispiel:

elif [[ $line == \<EpisodeName\>* ]]; then 
    actualEname=${line//<\/EpisodeName>/} 
    actualEname=${actualEname//<EpisodeName>/} 
    actualEname=${actualEname//&amp;/&} 
    actualEname=${actualEname//&ndash;/-} 
    for string in '|' '&lt;' '&gt;' '&quot;' '?' '*' '<' '>' ':' '"' '+' '\' '[' ']' '/' 
    do 
     actualEname=${actualEname//$string} 
    done 

Sie hatten ein extra &amp; in dieser Linie und eine Menge unnötiger Apostrophe und Flucht, nebenbei bemerkt. Außerdem werden HTML-Entitäten konvertiert und anschließend gelöscht. Warum löscht man sie nicht einfach am Anfang? Sie scheinen auch einige g (globale) Modifikatoren zu fehlen.

Test3:

$ time { for i in {1..100}; do 
    line='<EpisodeName>&lt;foo&amp;bar&ndash;baz&gt;Season&ndash;3&ndash;&quot;quux&quot;?*<>:"+\[]/</EpisodeName>' 
    actualEname=$(echo "$line" | sed -e 's/<\/EpisodeName>//' -e 's/<EpisodeName>//' -e 's/&amp;/\&/g' -e 's/&quot;/"/g' -e 's/&ndash;/-/g' -e 's/&lt;/</g' -e 's/&gt;/>/g' |tr -d '|?*<":>+\\[]/') 
done; } 

real 0m7.779s 
user 0m3.164s 
sys  0m5.436s 

Test4:

$ time { for i in {1..100}; do 
    line='<EpisodeName>&lt;foo&amp;bar&ndash;baz&gt;Season&ndash;3&ndash;&quot;quux&quot;?*<>:"+\[]/</EpisodeName> 
    actualEname=${line//<\/EpisodeName>/} 
    actualEname=${actualEname//<EpisodeName>/} 
    actualEname=${actualEname//&amp;/&} 
    actualEname=${actualEname//&ndash;/-} 
    for string in '|' '&lt;' '&gt;' '&quot;' '\?' '\*' '<' '>' ':' '"' '+' '\\' '[' ']' '\/' 
    do 
     actualEname=${actualEname//$string} 
    done 
done; } 

real 0m5.403s 
user 0m2.492s 
sys  0m2.960s 
+0

Die ‚<‘ ‚>‘ ‚"‘ müssen in ‚<' '>‘ und ‚"‘Jede Art und Weise, dass schneller tun geändert werden –

+0

Wirklich, das Wichtigste ist, das ist & char –

+1

@ Adam:.?. In Original, Du änderst sie und löschst sie. Warum löschst du sie nicht einfach nur? Wenn du beides noch tun willst, kannst du weitere Anweisungen in der Form 'actualEname = $ {actualEname // </<}' hinzufügen. Wir haben eine Methode gezeigt, die schneller ist: Sie können sehen, ob die Vorverarbeitung Ihrer gesamten Datei außerhalb der Schleife statt Zeile für Zeile innerhalb der Schleife schneller ist.'während Lese -r Typ Zeile; if [[$ type == "..."]]; echo "$ line" >> "$ outputfile"; ... done <<(sed ... "$ filename" | tr ...) 'wo eines der Dinge, die' sed' machen würde, ist '' in "EpisodeName" als erstes ... –

0

Die Verlangsamung ist höchstwahrscheinlich auf die sehr hohe Anzahl von Prozess-Spawns zurückzuführen, die in diesem Skript vorkommen (sed, tr).

Sie könnten ein viel schnelleres Ergebnis erzielen, indem Sie ein Programm mit einem XML-Parser aufrufen, um es einzulesen und an die verschiedenen Dateien auszugeben. Wenn Sie es in der Bash behalten müssen, finden Sie vielleicht etwas, das XSLT tun kann, um von dem XML zu dem Format zu konvertieren, das in den Dateien verwendet wird, und es zu teilen.

Persönlich würde ich so etwas in Perl tun.

+0

Ja. Der Code von OP ist bereits ziemlich ähnlich dem, wie Perl aussehen würde, daher sollte ein Neuschreiben nicht schwierig sein. – liori

+0

Aye, Perl war ursprünglich eine Mischung aus C, sed, awk und sh. – Orbling

+0

Wer hat das negativ gewählt, als das, was ich gesagt habe, der Hauptbestandteil der akzeptierten Antwort "weniger externe Programme verwenden" war ?! – Orbling

0

BASH, das um Datenmanipulation und Dateioperationen entwickelt werden soll.

Bash ist für interaktive Befehlsverarbeitung und Verknüpfung von Programmen über Pipes konzipiert. Heavy-Data-Processing ist nicht der Design-Raum eines * sh, den ich kenne.

Python oder Perl wäre eine viel bessere Wahl für den Problemraum.

0

ich das gerade versucht:

 echo "Parsing Downloaded information: $NewShowName.xml " 
     while read line 
     do 




      if [[ $line == \<\/Episode\> ]]; then 
       ((++recordNumber)) 
       echo -ne "Building Record:$recordNumber ${actualEname:0:20}   \r" 1>&2 
       echo "$EpisodeName" >> "$mythicalLibrarian/$NewShowName/$NewShowName.actualEname.txt"& 
       Ename=`echo "$actualEname" |sed 's/;.*//'` 
       echo "$EpisodeName" >> "$mythicalLibrarian/$NewShowName/$NewShowName.Ename.txt"& 
       echo "$FirstAired" >> "$mythicalLibrarian/$NewShowName/$NewShowName.FAired.txt"& 
       echo "$SeasonNumber" >> "$mythicalLibrarian/$NewShowName/$NewShowName.S.txt"& 
       echo "$EpisodeNumber" >> "$mythicalLibrarian/$NewShowName/$NewShowName.E.txt"& 
       EpisodeName="" 
       actualEname="" 
       FirstAired="" 
       SeasonNumber="" 
       EpisodeNumber="" 
      else 
       var=`echo $line |tr '<>' ' '|awk '{print $1}'` 

       value=`echo "$line"|sed -e s/'<'"$var"'>'// -e s/'<\/'"$var"'>'// -e s/'\&amp\;'/'\&'/ -e s/'\&quot\;'/'\"'/ -e s/'\&amp\;'/'\&'/ -e s/'\&ndash\;'/'-'/ -e s/'\&lt\;'/'\<'/ -e 's/'\&gt\;'/'\>'/' |tr -d '|\?\*\<\"\:\>\+\\\[\]\/'` 
       eval $var="'$value'" 
      fi 

Welche

1

Verwendung so etwas wie XMLStarlet auf dem schnelleren Prozessor 43 Sekunden dauerte, die XML zu verarbeiten ausgelegt ist.

0

Heilige Kuh Dennis Williamson, parst sie in weniger als 1/2 Sekunde. Es flackert nur über den Bildschirm. Es dauerte 15 Sekunden, aber jetzt ist es so schnell, dass ich nicht einmal sagen kann, dass es passiert.

Dies sind die Änderungen, die Dennis Williamson vorgeschlagen hat. Ich poste es nur hier.

  echo "Parsing Downloaded information: $NewShowName.xml " 
      while read line 
      do 

       if [[ $line == \<\/Episode\> ]]; then 
        ((++recordNumber)) 
        echo -ne "Building Record:$recordNumber ${actualEname:0:20}   \r" 1>&2 
        echo "$actualEname" >> "$mythicalLibrarian/$NewShowName/$NewShowName.actualEname.txt" 

        echo "$Ename" >> "$mythicalLibrarian/$NewShowName/$NewShowName.Ename.txt" 
        echo "$FAired" >> "$mythicalLibrarian/$NewShowName/$NewShowName.FAired.txt" 
        echo "$SeasonNr" >> "$mythicalLibrarian/$NewShowName/$NewShowName.S.txt" 
        echo "$EpisodeNr" >> "$mythicalLibrarian/$NewShowName/$NewShowName.E.txt" 
        Ename="" 
        actualEname="" 
        FAired="" 
        SeasonNr="" 
        EpisodeNr="" 

#Get actual show name 
       elif [[ $line == \<EpisodeName\>* ]]; then 
        line=${line/<\/EpisodeName>/} 
        line=${line/<EpisodeName>/} 
        line=${line/&lt;} 
        line=${line/&gt;/} 
        line=${line/&quot;/} 
        line=${line/&amp;/&} 
        line=${line/\|/} 
        line=${line/\?/} 
        line=${line/\*/} 
        line=${line/\:/} 
        line=${line/\+/} 
        line=${line/\\/} 
        line=${line/\//} 
        line=${line/\[/} 
        line=${line/\]/} 
        line=${line/\'/} 
        line=${line/\"/} 
        actualEname=${line/&ndash;/-} 
        Ename=${actualEname/;*/} 

#Get OriginalAirDate 
       elif [[ $line == \<FirstAired\>* ]]; then 
        line=${line/<\/FirstAired>/} 
        line=${line/<FirstAired>/} 
        FAired=$line 

#Get Season number 
       elif [[ $line == \<SeasonNumber\>* ]]; then 
        line=${line/<\/SeasonNumber>/} 
        line=${line/<SeasonNumber>/} 
        SeasonNr=$line 

#Get Episode number 
       elif [[ $line == \<EpisodeNumber\>* ]]; then 
        line=${line/<\/EpisodeNumber>/} 
        line=${line/<EpisodeNumber>/} 
        EpisodeNr=$line 
       fi 
      done < "$mythicalLibrarian/$NewShowName/$NewShowName.xml" 


      chmod 666 "$mythicalLibrarian"/"$NewShowName"/"$NewShowName".actualEname.txt 
      chmod 666 "$mythicalLibrarian"/"$NewShowName"/"$NewShowName".Ename.txt 
      chmod 666 "$mythicalLibrarian/$NewShowName/$NewShowName".FAired.txt 
      chmod 666 "$mythicalLibrarian"/"$NewShowName"/"$NewShowName".S.txt 
      chmod 666 "$mythicalLibrarian/$NewShowName/$NewShowName".E.txt 
      GotNewInformation=1 
+0

Ich bin froh, es hat gut für Sie gearbeitet. Es ist nur notwendig, '#% *? \ /' Im Substitutionsoperator zu entgehen, und Sie müssen es nicht "schließen", wenn Sie gerade eine Löschung vornehmen, z. 'line = $ {line/|}'. –

Verwandte Themen