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-Key: 183210

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

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

Member: mathe172
mathe172 Apr 06, 2012 at 21:09:41 (UTC)
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
Mitglied: 106009
106009 Apr 06, 2012 at 21:53:19 (UTC)
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ß
Member: bastla
bastla Apr 06, 2012 at 22:21:19 (UTC)
Goto Top
@106009
Seit wann erstellt man per "dir /b" Dateien?
Seit Erfindung der Ausgabeumleitung ... face-wink

Grüße
bastla
Mitglied: 106009
106009 Apr 06, 2012 at 22:42:59 (UTC)
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ß
Member: bastla
bastla Apr 06, 2012 at 22:48:13 (UTC)
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
Mitglied: 106009
106009 Apr 06, 2012 at 22:55:00 (UTC)
Goto Top
Kannst du ja ruhig. Ich bleibe aber trotzdem dabei, dass die Zeile im Zusammenhang mit dem "Beitrag" missverständlich ist. :-P
Member: mathe172
mathe172 Apr 07, 2012 at 14:03:24 (UTC)
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
Member: dedalus2011
dedalus2011 Apr 08, 2012 at 15:09:26 (UTC)
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