Zugriff auf Array aus mehreren "Programm-Instanzen"

  • Hallo zusammen,
    ich habe mir ein Skript erstellt, das in einem Ordner alle Unterordner in separate ZipDateien packt, diese in diesem Ordner ablegt und die "alten" Ordner löscht. Alles gut - alles hübsch.... Dazu nutze ich einen externen Packer über CLI (Command Line Interface) mit "RunWait"
    Das läuft nun linear - also Ordner 1 bis Ordner 67 wird durchgehackt ...

    Geht ja aber auch parallel - Ich könnte also ein Hauptprogramm (zur Verwaltung) starten und aus diesem heraus das ZipProgramm mit Übergabe der Parameter starten und das auf 3 bis 5 Prozesse begrenzen, je nach Rechnerleistung.

    Daran teste ich nun schon ein paar Tage. Die Übergabe der Parameter ist aber sehr schwierig, da sehr lang und mit Leerzeichen behaftet. Hier mal als Beispiel ein Aufruf: "Zip.exe u -r -m1 -ep4 "_Hörbuch\_TestArchiv-2" "F:\_Hörbuch\_TestArchiv-2\Agatha Christie - 24 Schwarzdrosseln.zip" "F:\_Hörbuch\_TestArchiv-2\Agatha Christie - 24 Schwarzdrosseln\*"

    Über das $cmdLine - Array diese Parameter zu übertragen ist sehr schwieg, da der Einsatz der Zeichen ", ' und chr(34) in Variablen verpackt ganz eigenartige Ergebnisse erzeugt. Den immer gleichen Aufruf "Zip.exe u -r -m1 -ep4 " hab ich nun in einen Umgebungsvariable geschoben und brauche ihn nicht mehr im Aufruf übertragen. Ich hoffe, daß ich die Situation verständlich beschrieben habe....
    Ich will nun die Parameterdaten in ein Array schreiben.
    Und jetzt kommt meine Frage:

    Kann ich im "Hauptprogramm" ein Array ($aParameter) erzeugen, 3 ZipProgramme (Call...-Aufruf) ausführen und von diesen auf das Array $aParameter zugreifen? Also kann ich ein Array "Über - global" stellen damit mehrere zugreifen können?

    Ich könnte auch das Array in eine TXT schreiben und so die Daten übertragen... Aber geht es kürzer ????

    Vorab vielen Dank :klatschen:

    Wenn Du's eilig hast - geh langsam...

  • 1. Frage: Wo kommen diese Pfadangaben her? Du musst ja irgendwo definieren welche Ordner bearbeitet werden.

    2.

    Dazu nutze ich einen externen Packer über CLI (Command Line Interface) mit "RunWait"

    Wenn es nur der Aufruf ist - warum dann RunWait und nicht Run()? Mit letzterem hättest du nämlich deine Parallelität.


    3. Wenn hingegen noch hinterher mit AutoIt-Code da an den Ordner weitergearbeitet wird, dann müsstest du dies natürlich entsprechend behandeln.


    Eine Möglichkeit wäre wie von dir vorgeschlagen, dass Skript aufzuteilen und die Unteraufgabe einer Ordnerbehandlung als eigenen Prozess auszuführen.
    Dort musst du dich halt um die Übergabe der Pfadangaben kümmern und da würde ich dir raten den Weg der Aufrufparameter weiterzugehen. Als Austauschspeicher würden auch Dateien gehen oder direkt ein shared-Memory aber das wird dann zu aufwendig und unübersichtlich und da das Subprogramm ja lediglich die Pfade benötigt, kann man die auch ziemlich problemlos einfach dem Programm übergeben.

    Eine weitere Möglichkeit wäre, das Skript in einen Master und einen Slave-Teil einzuteilen.

    Ob das derzeit laufende Skript der Master oder ein Slave ist, kann man z.B. über _Singleton lösen oder über einen Aufrufparameter für die Slave-Teile.
    Dann braucht man nicht 2 verschiedene Skripte.

    Oder du arbeitest ganz normal mit einem einzigen Skript weiter aber rufst die zip.exe halt parallel auf wie oben beschrieben.
    Dann lässt du eine Dauerschleife laufen, die für jede Prozess-ID der Run-Aufrufe prüft ob diese schon abgeschlossen wurden und falls ja, dann entsprechend die Restarbeiten hierzu auszuführen.

    Wenn das alles Aufgaben sind die vom Kommandozeileninterpreter erledigt werden können (Programm aufrufen, Datei kopieren, Ordner löschen klingt für mich so), dann kannst du das auch alles in einen kombinierten Aufruf packen wobei die einzelnen Subbefehle per & verknüpft werden (von AutoIt aufgerufen musst du hierbei an das @ComSpec denken). Auf die Art kannst du von AutoIt per Run mehrere solche Jobs parallel starten.

    Aber wie gesagt: Die Grundfrage für uns wäre eigentlich eher 1.: Wo kommen die Pfadangaben her.

  • Hi,

    zunächst ist es immer gut, ein Script zu posten welches "optimiert" werden soll. Erfahrungsgemäß sind in 99% aller Fälle unzureichende Kenntnisse in Kombination mit einem XY-Problem die Ursache für solche Postings...

    Ich hoffe, daß ich die Situation verständlich beschrieben habe....

    Ein Script sagt mehr als 1000 Worte ;)

    Dazu nutze ich einen externen Packer über CLI (Command Line Interface) mit "RunWait"

    Du möchtest mehrere Instanzen nutzen, wieso dann RunWait() und nicht Run()?

    das ZipProgramm mit Übergabe der Parameter starten und das auf 3 bis 5 Prozesse begrenzen

    Macht Sinn, allerdings ist fraglich, was die "Rechnerleistung" begrenzt. In deinem Beispiel entspricht eine Minute "Hörbuch" ca. 1MB, wenn du da etliche GB hast, dann belastet der ZIP-Vorgang eher den Prozessor, wenn du hunderttausende kleine Dateien hast, eher die Festplatte/SSD.

    Ich würde da dynamisch rangehen und so viele Prozesse starten, bis entweder die Transferleistung der Festplatte zu ca. 80% ausgelastet ist oder die Prozessorleistung....

    Ich könnte auch das Array in eine TXT schreiben und so die Daten übertragen... Aber geht es kürzer ????

    Könntest du machen....wieso hast du es nicht probiert? Man "könnte" auch noch ganz andere Sachen machen...

    Über das $cmdLine - Array diese Parameter zu übertragen ist sehr schwieg, da der Einsatz der Zeichen ", ' und chr(34) in Variablen verpackt ganz eigenartige Ergebnisse erzeugt.

    In Ermangelung eines testfähigen Scriptes kann hier NIEMAND deine "eigenartigen" Ergebnisse nachvollziehen.

    "Eigenartig" ist keine Fehlerbeschreibung!


    Zur Sache!

    Wenn du willst, dass dir jemand ein Script schreibt, welches unter x-prozentiger Auslastung der Systemressourcen Verzeichnisweise rekursiv Dateien Zippt und dann die Originaldateien löscht, wieso schreibst du das dann nicht?

    Wenn du willst, dass dir jemand syntaktisch oder programmiertechnisch "hilft" dann stelle konkrete Fragen mit Beispielen zu diesem Problem!

    Vorab vielen Dank :klatschen:

    Nicht dafür....

    Ich hätte dir wirklich gerne weitergeholfen, aber womit? :(

  • Ich sehe ja manchs immer sehr pragmatisch. Machst Du das jeden Tag bei anderen Verzeichnissen - oder nur einmal?

    Bei einmal - lass doch einfach mal den Rechner über Nacht arbeiten, dann ist er doch auch fertig.

    Wenn Dir Aufrufe zu lange werden, dann zerleg das doch in ein par Variable. Die füllen sich dann "ähnlicher". Run anstelle von runwait (siehe AspirinJunkie) hilft auch es schneller zu machen - andererseits ist auch die Schreib/Leeseleistung der Platten zu beachten.

    Während in Autoit " und ' meist alternativ zu verwenden sind, ist bei Export nach DOS " <>'.

    D.H. Du musst dafür sorgen, dass die " in Dos ankommen. DOS mag keine '

    so long

    Peter

    Ps: Beachte bitte die Hinweise von Andy und Aspirinjunkie

    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 zusammen und Danke für die Antworten, auf die ich gerne eingehen möchte.

    Ich bin Autodidakt und so sehen auch meine Script's aus. Sehr chaotisch und ich glaube recht schwer verständlich - auch wenn Ihr darin geübt seid. Ich wollte Euch nicht dieses Durchfitzen auflasten.

    Zitat

    1. Frage: Wo kommen diese Pfadangaben her? Du musst ja irgendwo definieren welche Ordner bearbeitet werden.

    Die Pfadangaben erzeuge ich mit "_RecursiveFileListToArray" (Danke an den Autor). Ich muß sie nachbehandeln, um die Vorgaben des Zip-CLI zu entsprechen. Das Problem waren anfangs die Leerzeichen in den Ordner- und Dateinamen.

    Zitat


    Wenn es nur der Aufruf ist - warum dann RunWait und nicht Run()? Mit letzterem hättest du nämlich deine Parallelität.

    Ich nutzte "RunWait" da es sich um ca. 1500 Verzeichnisse, mehreren 100.000 Dateien oder grob 2 TB Datenvolumen handelte. Mit "Run" würde meine WinDose einschlafen und diese unkontrollierte Aktion würde sehr lange dauern. Mir war wichtig das Zippen zu automatisieren und dazu schrieb ich ein lineares Script. Später kam mir der Gedanke zur kontrollierten parallelen Verarbeitung. Das versuch ich jetzt. Um den ZipProzess selbst werden noch einige statistische Daten und die Zeitvorschau berechnet (wann fertig). Mir geht es um die Kontrolle wie viele Prozesses gestartet werden.

    Zitat

    Während in Autoit " und ' meist alternativ zu verwenden sind, ist bei Export nach DOS " <>'.

    D.H. Du musst dafür sorgen, dass die " in Dos ankommen. DOS mag keine '

    Danke für diese Hinweis - war mir bis jetzt nicht bekannt ..

    Und nein ich möchte nicht das mir jemand ein Scirpt schreibt. Wie oben erwähnt - Autodidakt - ich will das selbst in die Tastatur hämmern. Das macht mir Spaß das Tüfteln, egal was Andere sagen ... learning by doing

    Fazit:

    Wenn ich im bereits lauffähigen Script mit "Run" arbeiten möchte, müßte ich also über eine Schleife die Anzahl der ZipAufrufe steuern. Über die Id des Prozesses könnte das bestimmt gehen.

    Sehe ich das richtig ?

    Den ganzen andern Krempel könnte ich mir sparen....

    Wenn Du's eilig hast - geh langsam...

  • Eine Schleife mit einem Sleep am Ende, dann immer wieder nachsehen ob ein Prozess zu Ende, wenn ja einen neuen starten?

    Ich kenne deinen Packer nicht, aber vielleicht hilft ein Blick auf 7-zip. Open Source und hat ein gut funktionierende command line Oberfläche. Pack mal was und vergleiche die Zeiten

    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)

  • Wenn ich im bereits lauffähigen Script mit "Run" arbeiten möchte, müßte ich also über eine Schleife die Anzahl der ZipAufrufe steuern. Über die Id des Prozesses könnte das bestimmt gehen.

    Sehe ich das richtig ?

    Exakt so!

    Mal ein beispielhafter Grundaufbau hierfür: