dedalus2011
Goto Top

Parallele Verarbeitung von Batchjobs

Hallo,

es müssen mehrere Textdateien gleichzeitig verarbeitet werden, d.h. die Batchjobs parallelisiert werden. Habe mir folgendes überlegt:

set "worker=E:\worker.bat"  

ECHO Erzeugen %2 Kopien von %1

FOR  /L %%i IN (1, 1, %2) DO (
    ECHO Erzeuge thread %%i
 START "worker%%i" /Min %1 %%i %2   
)

Ein einzelner Batchjob/Thread wäre z.B.:

 

setlocal enabledelayedexpansion

set "Datei=D:\MyFile%1"  
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "D:\MyFile%1.txt"') do set "Zeile=%%j" && echo %%i  
pause

Dafür müssen aber die Dateien fortlaufend nummeriert werden: z.b. MyFile1, MyFile2 usw. Gibt's da eine andere Möglichkeit die Threads parallel laufen zu lassen ohne die Dateien fortlaufend nummerieren zu müssen?

Danke für Eure Ideen

Grüße
dedalus2011

Content-ID: 183210

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

Ausgedruckt am: 24.11.2024 um 15:11 Uhr

mathe172
mathe172 06.04.2012 um 23:09:41 Uhr
Goto Top
Hallo,

eine Möglichkeit, jeder Datei eine eindeutige Nummer zuzuordnen, wäre zum Beispiel, eine Datei mit den Dateinamen zu erstellen (per "dir /b" o.ä.)
Dann kann jeder Datei mit "findstr /n" eine Nummer gegeben werden.

Hoffe ich konnte es verständlich machen. (Wenn nicht, nachfragen)

MfG,
Mathe172
106009
106009 06.04.2012 um 23:53:19 Uhr
Goto Top
Hi,

Gibt's da eine andere Möglichkeit die Threads parallel laufen zu lassen ohne die Dateien fortlaufend nummerieren zu müssen?

Klar doch. Man wählt einfach unterschiedliche Dateinamen für die zu bearbeitenden Jobs..
Eine andere Möglichkeit wäre, ein Betriebssystem zu benutzen, das hellsehen kann. Kennst du eins? Ich nicht.


@mathe172
zum Beispiel, eine Datei mit den Dateinamen zu erstellen (per "dir /b" o.ä.)
Seit wann erstellt man per "dir /b" Dateien?

Gruß
bastla
bastla 07.04.2012 um 00:21:19 Uhr
Goto Top
@106009
Seit wann erstellt man per "dir /b" Dateien?
Seit Erfindung der Ausgabeumleitung ... face-wink

Grüße
bastla
106009
106009 07.04.2012 um 00:42:59 Uhr
Goto Top
@bastla
Zitat von @bastla:
Seit Erfindung der Ausgabeumleitung ... face-wink

Das geht aber nicht mit "o.ä." sondern mit "> Liste.txt". :-P
Wenn man die (nach meiner Ansicht) wirren Vorstellungen aus dem Beitrag liest, könnte man unter Dateinamen erstellen auch was Anderes verstehen. face-wink

Gruß
bastla
bastla 07.04.2012 um 00:48:13 Uhr
Goto Top
@106009
könnte man unter Dateinamen erstellen auch was Anderes verstehen. face-wink
Da muss ich mathe172 aber etwas in Schutz nehmen - er hat ja ausdrücklilch "eine Datei mit den Dateinamen" vorgeschlagen ...

Grüße
bastla
106009
106009 07.04.2012 um 00:55:00 Uhr
Goto Top
Kannst du ja ruhig. Ich bleibe aber trotzdem dabei, dass die Zeile im Zusammenhang mit dem "Beitrag" missverständlich ist. :-P
mathe172
mathe172 07.04.2012 um 16:03:24 Uhr
Goto Top
@TE und ollidolli:
Man könnte per
>Dateien.txt dir /b
eine Datei mit den Dateinamen aller zu bearbeitenden Dateien machen (gegebenenfalls einen Filter wie z.B. *.txt einbauen)
Die Anzahl der Dateien liesse sich dann in der Hauptdatei mit
for /f "delims=:" %%A in ('finstr /n "^" "Dateien.txt"') do set "Anzahl=%%A"  
herausfinden.

In der Verarbeitungsdatei kann dann mit
for /f "tokens=1* delims=:" %%A in ('finstr /n "^" "Dateien.txt"') do if "%%A"=="%1" set "Datei=%%B"  
[Edit: die richtige Datei gefunden werden.]
Ich hoffe es ist eindeutiger so.

MfG,
Mathe172
dedalus2011
dedalus2011 08.04.2012 um 17:09:26 Uhr
Goto Top
hallo,

es klappt bei mir jetzt dass die einzelne Threads parallel verarbeitet werden, ohne die DAteien explizit nummerieren zu müssen. Da aber das Hauptprogramm mehr cpu braucht, wollte ich die Anzahl der parallel zu verarbeitenden Dateien auf eine gewisse Anzahl beschränken (z.B. im Code wäre dies durch "nofiles=3" festgelegt). Mein Problem wäre dass das Hauptprogramm (konkreter gesagt die Zeile 19 im Code) sich in der Unterroutine :sub nicht ausführen lässt ("The system cannot find the batch file specified").

Freue mich über jeden Hinweis

Grüße
dedalus2011

setlocal enabledelayedexpansion


set "Quelle=%Ordner_PROT%"  

REM Count number of files

for /f %%i in ('dir /b /a-d %Quelle% ') do set /a count+=1 && set !count!=count  

if %count% gtr 3 (set /a zaehler=%count% && set nofiles=3 && set /a index=!nofiles! && set first=1 && call :sub) else call :sub2

goto :end


:sub

REM Run only %nofiles% at a time

call E:\spawnmany.bat E:\worker.bat %index% %Quelle% %first%


set /a zaehler=%zaehler% - %nofiles% 
set /a first=%first% + %nofiles%
set /a variable = %count% - %index%

if %variable% gtr %nofiles% (set /a index= %index% + %nofiles%) else set /a index=%index% + %zaehler%

if %Zaehler% gtr 0 goto :sub


goto :eof

:sub2
echo EXCEUTE NORMAL CODE

goto :eof

:end

Die spawnmany.bat Datei:

FOR  /L %%i IN (%4, 1, %2) DO (
    ECHO Spawning thread %%i
 START "Worker%%i" /Min %1  %%i %2  %3  
)


echo Please wait until all the threads are completed!%

pause


Hat sich erledigt..hatte den "call" davor vergessen. Es klappt jetzt. Danke an alle für Eure Hilfe

Grüße
dedalus2011