Meine rekursive FTP-Suche verbessern

  • Hey Leute,

    ich durchsuche per FTP in einem Programm, das ich weitergebe, vom Linux-Receiver gemountete Verzeichnisse nach Filmen, Bildern und XML-Dateien.

    Hierbei können die Receiver auf eingebaute Festplatten, USB-Platten und NAS-Laufwerke zugreifen, die unter Umständen erst geweckt werden müssen.
    Im Grunde funktioniert das soweit. Jedoch höre ich immer mal wieder auch, dass es ewig lange dauern würde, bis alle Daten vorhanden sind.

    Ich durchsuche schon nur zwei Ebenen, damit es nicht zu lange dauert. Aber ich denke, ich mache es prinzipiell wahrscheinlich schlecht. Daher möchte ich euch mal bitten, mir eure kritische Beurteilung meiner rekursiven Suche mitzuteilen.

    Über eure Hinweise freue ich mich :)

    Spoiler anzeigen

    Das hat sicher schon jemand besser umgesetzt. Über solche Hinweise freue ich mich auch.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (13. Juni 2015 um 16:05)

  • Hi,
    prinzipiell sehe ich keine großartigen "Zeitfresser"...

    AutoIt
    _ArrayDelete($aFolder, 0)
    						For $k = 0 To UBound($aFolder) - 1

    Könnte man so machen:

    AutoIt
    ;_ArrayDelete($aFolder, 0)
    						For $k = 1 To UBound($aFolder) - 1

    und das _ArrayAdd($aStartfolders, $aStartfolders[$j] & "/" & $aFolder[$k])
    könntest du dir auch sparen, indem du das Array mit bspw. 20000 Einträgen vorher erstellst und nur noch einen Index mitlaufen lässt...

    Weiterhin solltest du diesen Scriptteil profilen, d.h. die Laufzeit sämtlicher Schleifen "ausstoppen".
    Wichtig ist, zuerst den "Zeitfresser" zu lokalisieren, erst dann kann/muss man über alternativen Code nachdenken!

  • Danke dir Andy!

    Weiterhin solltest du diesen Scriptteil profilen, d.h. die Laufzeit sämtlicher Schleifen "ausstoppen".
    Wichtig ist, zuerst den "Zeitfresser" zu lokalisieren, erst dann kann/muss man über alternativen Code nachdenken!

    Die Tipps werde ich alle übernehmen. Das Zeitstoppen hätte ich tatsächlich auch mal machen müssen. Das werde ich jetzt mal einbauen und mal sehen, wann es bei den Leuten hängt. Vielen Dank nochmal :)

    Grüße autoiter

  • lass dir auch die Zeit für die einzelnen Befehle _FTP_ListToArray($conn) und _FTP_DirSetCurrent($conn, $aStartfolders[$j]) zurückgeben!
    Der Rest sollte eigentlich keine Zeit kosten....

  • Hallo zusammen :)

    Als ich Andys Tipps umsetzen wollte, ist mir aufgefallen, dass ich da eine ziemlich grobe Ineffizienz im Script gepflegt habe. Und zwar hatte ich die gefundenen Unterverzeichnisse einfach an das Array angehängt. Danach das vergrößerte Array zur Suche verwendet und dann noch einmal ein vergrößertes Array zur Suche verwendet.. Ich habe hier versucht, diese Schwäche gleich mit zu beseitigen.

    Ich kann mir nämlich stark negative Auswirkungen vorstellen, wenn das Script etwa länger auf Antwort von einem Verzeichnis (teilweise unterschiedliche Geräte) warten muss, weil das ja mehrfach wiederholt wird..

    Ich muss das noch testen lassen, aber hier kann ich ja schon mal zeigen was ich jetzt zur Auswertung geschrieben habe und wie ich das Prozedere geändert habe, damit es effizienter wird.
    Über eure Kritik freue ich mich wieder.


    Das _ArrayAdd ist dringeblieben. Der Unterschied ist, dass ich nicht $aStartfolders[$j], sondern immer $aStartfolders[1] durchsuche. Nach jedem Durchlauf wird $aStartfolders[1] mit _ArrayDelete gelöscht. So kommen alle Elemente mal an Position eins. Beim nächsten Durchlauf der Hauptschleife, sind die alten Elemente aber nicht mehr Inhalt vom Array $aStartfolders. Damit werden sie auch nicht erneut zur Suche benutzt.

    Edit: Sorry, ich hab das Syntaxhighlighting hier einfach nicht hinbekommen.

    Spoiler anzeigen

    Grüße autoiter

    5 Mal editiert, zuletzt von bernd670 (16. Juni 2015 um 20:08) aus folgendem Grund: Für Syntaxhighlighting einfach in der Combobox "Syntax-Hervorherbung" AutoIt auswählen

  • Interessant wären jetzt die Zeiten der einzelnen Programmteile/Befehle, damit man sehen kann, an welchem Schräubchen man drehen muss, um effizienter zu werden.

    Wenn _FTP_ListToArray($conn) bspw. 3 Sekunden dauert, dein Arraygedöns zum Schreiben und Auswerten aber nur 200ms, dann brauchst du dir über "Optimierung" bei den Arrays keine Gedanken mehr machen....

  • Die Frage mag ja blöd klingen, aber was wird denn eigentlich als "LANG" empfunden? Ich hatt ein vergleichbares Problem.
    Ein Sript, das aus Druckdatein PDF erstellt (Individuell per Eingabe) wurde als LANGSAM empfunden. Der Schirm war leer, die Kollegen saßen am Monitor und nichts geschah, bis das PDF aufpoppte. Nun habe ich einen von Uez´s Pausenfüllern sprich Warteschirmen am laufen - und siehe da - sobald sich etwas bewegt dauert es plötzlich nicht mehr zu lange.

    Das geht einem aber selbst auch so - Programme die etwas OHNE Rückmeldung erledigen sind langweilig, stehen im verdacht nicht richtig zu funktionieren usw.

    Vielleicht lößt das Dein Problem - denn wie lange ist lang?


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo autoiter,

    ich habe vor längerer Zeit eine rekursive Funktion geschrieben:

    Spoiler anzeigen


    diese Funktion hat zumindestet unter 3.3.6.1 funktiniert. Hier noch ein Demo-Beispiel dazu:

    Spoiler anzeigen


    Ich kann es derzeit aber nicht selbst testen da ich über meinen Internetzugang (freies WLan) keinen Zugang für FTP-Dienste bekomme und dies sich in absehbarer Zeit auch nicht ändern wird. Der Bug der nächsten Stable bei _Ftp_ListToArray2D sollte ja mittlerweile behoben sein, ansonsonsten findest du in [Beispiel] Update 13.03.13 FTP-Downloader (rekursiv mit allen Unterverzeichnissen) auch noch eine Lösung mit _Ftp_ListToArray die aber nicht so viel Komfort hat.

  • Hey Leute,

    danke für eure Antworten :)

    @Andy
    Meinst du also ich sollte auch noch zwischen den einzelnen Befehlen mit TimerInit und Diff arbeiten?
    Also prinzipiell scheint es so zu sein, wie du es dir vorstellst. Das Hauptproblem sind wohl die wiederholten _FTP_ListToArray($conn) Operationen. Der Rest geht wohl deutlich schneller. Das muss ich mal genau austesten.
    Ich habe den kompletten Ablauf im neuen und im alten alte Script aber mal gestoppt.

    Ich greife auf ein angeschlossenes Laufwerk und einen PC, den ich als Datengrab benutze zu. Inklusive Unterordner geht es um etwa 30 Verzeichnisse und 380 Filme.

    Wenn die Platten wach sind, dauert es mit dem alten Script zwischen 1,8 und 2,4 Sekunden. Mit dem neuen aber nur 0,5 bis 1,2. Das schwankt zwar stark. Die Steigerung ist aber schon enorm.

    @Peter S. Taler
    Bei mir geht es, wie man oben sieht, so schnell, dass ich überhaupt keinen Ladebalken brauche. Andere haben mir berichtet, dass sie aber 20- 30 Sekunden warten müssen, obwohl etwa das NAS, auf das zugegriffen werden soll, 'wach' ist. Eine hübsche Animation wäre schon eine Besserung. Aber teilweise dauert es dennoch so lange, dass ich das unbedingt verbessern möchte.

    @autobert2
    Vielen Dank! Ich werde mir die UDF ansehen. Selbst wenn ich sie nicht direkt zum Laufen kriege, kann ich sie als Anschauungsmaterial verwenden bis ich sie verstehe :)

    Grüße autoiter

  • Wenn du jeden Overhead von AutoIt bei der eigentlichen Suche eleminieren willst, dann rate ich dringend zu GNU lftp. Das gibt es auch für Windows.

    Dann einfach von AutoIt aus

    Code
    lftp -e "find .; exit" ftp://test.com/


    ausführen und du hast einen rekursiven File-Tree so schnell wie möglich. Den kannst du dann mit den String-Befehlen durchsuchen. Dann bleibt nur der verbundene Server aus Bottleneck.

  • Danke dir für den Tipp! Ich habe es gleich mal geladen.
    Jetzt möchte ich das erst einmal allein mit AutoIt machen.
    Für die Zukunft werde ich aber gleich auch mal ausprobieren, wie das hiermit geht. :)

    Grüße autoiter

  • @autoiter

    bist Du Dir sicher, dass das am autoIT Code liegt? Was bei Dir auf dem Rechner in null komma nix läuft muß auch bei anderen (Gleicher Rechner Gleiches BS usw) im gleichen Tempo laufen - es sei denn - wir suchen an anderer Stelle.
    Leitungsqualität, schlechte Stecker usw.
    Anmelden am NAS. Du bist dauernd angemeldet? Andere müssen sich im Hintergrund erst anmelden. Admin bekommt bevorzugte Bandbreite usw.


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)