130834
Goto Top

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

Content-Key: 327355

Url: https://administrator.de/contentid/327355

Printed on: April 19, 2024 at 05:04 o'clock

Member: rubberman
Solution rubberman Jan 24, 2017 at 22:04:48 (UTC)
Goto Top
Was du immer so alles mit Batch umsetzen willst ...

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
Mitglied: 130834
130834 Jan 25, 2017 at 18:03:16 (UTC)
Goto Top
Danke. hab schon ein paar Ideen mehr.
Das da ;
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.

bereitet mir noch Sorgen.
Ich hab keine Ahnung wie ich das Bewerkstelligen könnte.
Member: rubberman
Solution rubberman Jan 25, 2017 updated at 19:05:23 (UTC)
Goto Top
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
Und gehen wir davon aus, dass Unterverzeichnisse jeweils gesondert behandelt werden sollen, dann könnte das so aussehen:
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")  
)
Mitglied: 130834
130834 Jan 25, 2017 at 19:15:34 (UTC)
Goto Top
Das funktioniert Ziiiemlich gut.
Vielen Dank. Ich denke damit hättest du's wieder mal :P
Profi.
Mitglied: 130834
130834 Jan 25, 2017 at 19:28:09 (UTC)
Goto Top
screenshot_2

Mir ist das schon bei Recycle aufgefallen, mache ich etwas falsch? Die Pfade mit "Program" drin sollten eigentlich aussortiert werden....
Member: rubberman
rubberman Jan 25, 2017 at 20:02:03 (UTC)
Goto Top
Wie sieht das Kommando aus, mit dem du die ursprüngliche Liste erzeugst?
Mitglied: 130834
130834 Jan 25, 2017 at 20:06:06 (UTC)
Goto Top
robocopy %%H:\. NULL !endings! /xd windows recycle program avatar roaming msoffice temporary sample themes uploads csize resource internet com_ intel common resources drivers texture profiles library clipart manual games framework64 setupcache autograph maps amd64 cache support guide abbyy application thumbnails avatars template adobe appdata temp /l /s /ndl /xx /nc /ns /njh /njs /fp
Member: rubberman
rubberman Jan 25, 2017 at 20:29:24 (UTC)
Goto Top
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*".
Mitglied: 130834
130834 Jan 25, 2017 updated at 21:05:52 (UTC)
Goto Top
robocopy %%H:\. NULL !endings! /xd "*microsoft*" "*windows*" "*recycle*" "*program*" "*appdata*" "*temp*" "*driver*" "*avatar*" "*roaming*" "*msoffice*" "*temporary*" "*sample*" "*themes*" "*uploads*" "*csize*" "*resource*" "*internet*" "*com_ intel*" "*common*" "*resources*" "*texture "*profiles*" "*library*" "*clipart*" "*manual*" "*games*" "*framework64*" "*setupcache*" "*autograph*" "*maps*" "*amd64*" "*cache*" "*support*" "*guide*" "*application*" "*thumbnails*" "*avatars*" "*template*" "*adobe*" /l /s /ndl /xx /nc /ns /njh /njs /fp  
Wenn ich das hier tue, ist der Output der Output von Robocopy, und das Skript läuft etwa 3 Sekunden. nichts wird verarbeitet.

So in etwa:

25.01.2017-21:58:59,65 
------------------------------------------------------------------------------- 
ROBOCOPY     ::     Robustes Dateikopieren für Windows                               
------------------------------------------------------------------------------- 
Gestartet: Mittwoch, 25. Januar 2017 21:59:00 
Quelle - C:\ 
Ziel - C:\Users\XXX\Desktop\project17\NULL\ 
Dateien : *.png 
ECHO ist ausgeschaltet (OFF).
Ausf. Verzeichnisse : *microsoft* 
*windows* 
*recycle* 
*program* 
*appdata* 
*temp* 
*driver* 
*avatar* 
*roaming* 
*msoffice* 
*temporary* 
*sample* 
*themes* 
*uploads* 
*csize* 
*resource* 
*internet* 
*com_ intel* 
*common* 
*resources* 
ECHO ist ausgeschaltet (OFF).
Optionen: /DCOPY:DA /COPY:DAT /R:1000000 /W:30  
------------------------------------------------------------------------------ 
FEHLER: Ungültiger Parameter #100 : "*texture *profiles* *library* *clipart* *manual* *games* *framework64* *setupcache* *autograph* *maps* *amd64* *cache* *support* *guide* *application* *thumbnails* *avatars* *template* *adobe* /l /s /ndl /xx /nc /ns /njh /njs /fp"   
Einfache Syntax :: ROBOCOPY Quelle Ziel /MIR 
Quelle :: Quellverzeichnis (Laufwerk:\Pfad oder 
\\Server\Freigabe\Pfad) 
Ziel :: Zielverzeichnis (Laufwerk:\Pfad oder 
\\Server\Freigabe\Pfad) 
/MIR :: Spiegelt eine vollständige Verzeichnisstruktur. 
Weitere Informationen erhalten Sie über den Befehl "ROBOCOPY /?"   
ECHO ist ausgeschaltet (OFF).
**** Der Befehl "/MIR" kann Dateien sowohl kopieren als auch LÖSCHEN.   
25.01.2017-21:59:01,34 
listed_files:116 

Sieht kapput aus.

EDIT; nevermind, ich seh den fehler....
Member: rubberman
rubberman Jan 25, 2017 at 21:06:06 (UTC)
Goto Top
Sieht kapput aus.
Ist es auch. Mindestens nach *texture fehlt das schließende Anführungszeichen. Solange du aber keine Leerzeichen in den Namensteilen hast, kannst du dir die Anführungszeichen auch sparen.
Mitglied: 130834
130834 Jan 25, 2017 at 21:35:44 (UTC)
Goto Top
Hahaha, ja ich hab's auch gesehen.
Funktioniert jetzt.
Viele dank nochmal.

lg clragon