
130834
24.01.2017, aktualisiert um 21:41:38 Uhr
Multitasking bei Massen-Verarbeitung (Batch)
Hey Leute,
Ich schraube gerade an Geschwindigkeit und Effizienz meiner Batch herum.
Ich versuche ziemlich viele Dateien auf einmal zu verarbeiten.
Deshalb Dachte ich mir es wäre Klug daraus mehrere Prozesse zu machen.
Ich habe eine Liste mit ziemlich vielen (ganzen/vollen) Dateipfaden.
Diese alle mit 1 For Schleife zu verarbeiten würde ganze Jahre dauern,
Deshalb dachte ich mir ich verarbeite diese in Sub-Prozessen, also ein Sub-Prozess pro Ordner.
( Sub-Prozess = start cmd /c Befehl, also ein neues cmd Fenster welches Befehle Verarbeitet und sich dann Wieder schließt. )
Ich möchte jedoch wiederum nicht all zuviel RAM benutzen,
weshalb von diesen Sub-Prozesse nicht mehr als 10 gleichzeitig laufen sollten.
Ich habe einen Haupt-Prozess welcher das ganze steuern sollte,
die Sub-Prozesse starten und die Pfade übergeben.
Ich habe mir Überlegt, die große Liste mit einer Menge String Manipulation und If Abfragen zu ganz vielen kleinen Listen zu verarbeiten und zwar
für jeden Ordner eine Datei welche alle Dateipfade enthält welche in diesem Ordner liegen.
Für Jede "kleine" Liste wird dann vom Haupt-Prozess eine Sub-Prozess aufgerufen und die Liste (als Quell-Pfad) übergeben.
Den Pfad jeder erfolgreich verarbeiteten Datei ( Dateien aus der Liste ) soll der Sub-Prozess in eine neue Liste schreiben.
Falls der Prozess plötzlich unterbrochen wird, soll er beim Neustart die Ursprüngliche Liste mit der neuen Subtrahieren,
um die noch nicht verarbeiteten Dateien noch verarbeiten zu können. Das Verkompliziert das für-jeden-Ordner-Prinzip etwas,
Denn bei nur 1 Liste habe ich nur 2 Dateien, bei jedoch z.B. 100 Listen, habe ich dann Plötzlich noch ein Paar mehr und schon entsteht Chaos.
Sobald der Prozess mit allen Pfaden in der Datei fertig ist, soll er die Liste löschen und sich schließen.
Das würde dann der Hauptprozess durch eine PID Abfrage merken, und den nächsten Starten.
Ich habe noch keine Idee wie ich das mit den Dateinamen unter einen Hut bringen würde,
und wie der Hauptprozess aufhören würde neue Sub-Prozesse zu starten sobald es 10 sind,
und auch nicht wie man Textdateien von einander Subtrahiert.
Wenn irgendjemand eine Idee hat wie man dies Effizienter bewerkstelligen oder diesen Weg in die tat umsetzten könnte,
wäre ich dafür sehr dankbar!
Für zusätzliche Infos einfach Fragen, ich weiß grad nicht welche man noch schreiben könnte.
Schönen Abend noch,
lg clragon
Ich schraube gerade an Geschwindigkeit und Effizienz meiner Batch herum.
Ich versuche ziemlich viele Dateien auf einmal zu verarbeiten.
Deshalb Dachte ich mir es wäre Klug daraus mehrere Prozesse zu machen.
Ich habe eine Liste mit ziemlich vielen (ganzen/vollen) Dateipfaden.
Diese alle mit 1 For Schleife zu verarbeiten würde ganze Jahre dauern,
Deshalb dachte ich mir ich verarbeite diese in Sub-Prozessen, also ein Sub-Prozess pro Ordner.
( Sub-Prozess = start cmd /c Befehl, also ein neues cmd Fenster welches Befehle Verarbeitet und sich dann Wieder schließt. )
Ich möchte jedoch wiederum nicht all zuviel RAM benutzen,
weshalb von diesen Sub-Prozesse nicht mehr als 10 gleichzeitig laufen sollten.
Ich habe einen Haupt-Prozess welcher das ganze steuern sollte,
die Sub-Prozesse starten und die Pfade übergeben.
Ich habe mir Überlegt, die große Liste mit einer Menge String Manipulation und If Abfragen zu ganz vielen kleinen Listen zu verarbeiten und zwar
für jeden Ordner eine Datei welche alle Dateipfade enthält welche in diesem Ordner liegen.
Für Jede "kleine" Liste wird dann vom Haupt-Prozess eine Sub-Prozess aufgerufen und die Liste (als Quell-Pfad) übergeben.
Den Pfad jeder erfolgreich verarbeiteten Datei ( Dateien aus der Liste ) soll der Sub-Prozess in eine neue Liste schreiben.
Falls der Prozess plötzlich unterbrochen wird, soll er beim Neustart die Ursprüngliche Liste mit der neuen Subtrahieren,
um die noch nicht verarbeiteten Dateien noch verarbeiten zu können. Das Verkompliziert das für-jeden-Ordner-Prinzip etwas,
Denn bei nur 1 Liste habe ich nur 2 Dateien, bei jedoch z.B. 100 Listen, habe ich dann Plötzlich noch ein Paar mehr und schon entsteht Chaos.
Sobald der Prozess mit allen Pfaden in der Datei fertig ist, soll er die Liste löschen und sich schließen.
Das würde dann der Hauptprozess durch eine PID Abfrage merken, und den nächsten Starten.
Ich habe noch keine Idee wie ich das mit den Dateinamen unter einen Hut bringen würde,
und wie der Hauptprozess aufhören würde neue Sub-Prozesse zu starten sobald es 10 sind,
und auch nicht wie man Textdateien von einander Subtrahiert.
Wenn irgendjemand eine Idee hat wie man dies Effizienter bewerkstelligen oder diesen Weg in die tat umsetzten könnte,
wäre ich dafür sehr dankbar!
Für zusätzliche Infos einfach Fragen, ich weiß grad nicht welche man noch schreiben könnte.
Schönen Abend noch,
lg clragon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 327355
Url: https://administrator.de/forum/multitasking-bei-massen-verarbeitung-batch-327355.html
Ausgedruckt am: 21.04.2025 um 22:04 Uhr
11 Kommentare
Neuester Kommentar
Was du immer so alles mit Batch umsetzen willst ...
Grundgerüst:
test1.bat
test2.bat
Grüße
rubberman
Grundgerüst:
test1.bat
@echo off &setlocal
for /l %%i in (1 1 50) do (
start "my title" cmd /c "test2.bat"
call :check
)
pause
exit /b
:check
for /f %%n in ('tasklist /nh /v /fi "imagename eq cmd.exe" /fo csv ^| find /c """my title"""') do if %%n geq 10 (>nul timeout /t 1 /nobreak & goto check)
exit /b
test2.bat
@echo off &setlocal
timeout /t 5
Falls der Prozess plötzlich unterbrochen wird
Pech. Ist bei so ziemlich jeder Anwendung so.Grüße
rubberman
Ich hab keine Ahnung wie ich das Bewerkstelligen könnte.
Joa, wie das nun bei dir genau aussieht und anschließend aussehen soll weiß ich ja auch nicht.Gehen wir mal von einer "list.txt" Datei aus, in der die Dateipfade halbwegs sortiert vorliegen.
list.txt
C:\bar\2rrg3k2.txt
C:\bar\weropav.txt
C:\bar\blub\x49wef.txt
C:\bar\blub\wrerjl.txt
C:\foo!\12lnsdv.txt
C:\foo!\sjlqnsb.txt
D:\baz&\wljbwrb.txt
D:\baz&\8lkne03.txt
test.bat
@echo off &setlocal
set "folder="
set "n=0"
for /f "usebackq delims=" %%i in ("list.txt") do (
set "currentfolder=%%~dpi"
set "file=%%~i"
setlocal EnableDelayedExpansion
if "!currentfolder!" neq "!folder!" (set /a n+=1 &set "folder=!currentfolder!" &>"list!n!.txt" type nul)
>>"list!n!.txt" echo !file!
for /f "tokens= 1*" %%j in ("!n! !folder!") do (endlocal &set "n=%%j" &set "folder=%%k")
)
Ja dann ist es klar. Verzeichnisse, die program heißen, werden ausgeschlossen. Im anderen Thread hatte ich dir "program*" vorgeturnt, was Verzeichnisnamen ausschließt, die mit program anfangen. Und wenn du Verzeichnisnamen ausschließen willst, die an irgendeiner Stelle program enthalten, wäre es "*program*".