ich muss mehrere sehr große Textdateien auslesen (teilweise ca. 1,5 Mio. Datensätze) und in Z-Tabellen schreiben, nachdem die eingelesenen Daten diverse Prüfungen durchlaufen haben. Ich würde das sehr gerne parallelisieren. Mir ist nur noch nicht ganz klar, wie ich das in ABAP bewerkstelligen kann.
Mir fällt die Möglichkeit ein, jede dieser Riesentextdateien jeweils in eine interne Tabelle einzulesen und diese Tabelle wiederum in mehrere kleinere Textdateien aufzuteilen, wegzuschreiben und diese Dateien mit einem Programm über mehrere Hintergrundjobs zu verarbeiten. Oder ist es möglich große Tabellen mittels EXPORT TO MEMORY an ein Programm zu übergeben? Welche Beschränkungen gibt es da?
Kann man die Zeilen aus den Textdateien über SELECT-OPTIONS an den empfangenen Report abgeben? Da gibt es aber doch bestimmt auch eine Größenbeschränkung (Datensatzlänge, -menge).
Fällt jemanden von den "alten" Hasen evtl. eine elegantere Möglichkeit ein?
Vielen Dank für eure Tipps!
Gruß
K.
P.S.: Ich habe mit einem kleinen Proggi mal eine SELECT-OPTIONS-Tabelle mit einem Feld von 1024 Byte Länge definiert und da mal 1,5 Mio. Datensätze reingejagt. Grenze ist der Arbeitsspeicher, sagt jedenfalls der Kurzdump. Bei meinem Vorhaben brauche ich nie 1,5 Mio. Zeilen an das empfangene Programm abzugeben. Von daher könnte das funktionieren. Aber elegant ist das nicht. Vielleicht habt ihr ja eine bessere Idee für mich. Das würde mich freuen.
Stichwort dazu ist "Processing between Tasks". Beruht darauf, dass ein RFC-fähiger Funktionsbaustein mehrfach (mit CALL FUNCTION ... STARTING NEW TASK) parallel aufgerufen wird und die Ergebnisse seiner Berechnungen an das weiterlaufende (bzw. wartende) Hauptprogramm zurück schickt.
Das Hauptprogramm benutzt das WAIT-Statement um auf die Prozesse zu warten
Die zurückkehrenden Prozesse rufen das beim Start angegebene Unterprogramm bzw. eine entsprechende Methode des Hauptprogramms auf und liefern so Ergebnisse zurück
Du solltest dabei nur darauf achten, dass nicht zu viele Prozesse gleichzeitig laufen - sonst steigt Dir die Basis bzw. die Anwender auf's Dach...
Es hat sich übrigens bewährt, die Parallelisierungs-Logik in einer Klasse zu kapseln und die Ergebnisse in ihren Attributen abzulegen. Prinzipiell kannst Du das aber auch in einem "plain old report" machen.
Vielleicht reicht Dir das ja schon als Anstoß, ansonsten frag ruhig nochmal nach.
andere Alternative:
Gib deinem Programm einen Parameter mit, welche Zeilen der Datei verarbeitet werden sollen.
Dann baust du dir ein Vorschaltprogramm, welches nur zählt wie viele Zeilen deine Riesendatei hat, und diese startet dann einfach dein Originalprogramm ein paar mal als Job und gibt mit welche Zeilen verarbeitet werden sollen.
Beispiel: Riesendatei = 1.000.000 Zeilen, du willst nur 10.000 davon gleichzeitig verarbeiten.
Dann ruft dein Vorschaltprogramm halt 100 Jobs.
1. Job: Zeilen 1-10.000
2. Job: Zeilen 10.001 - 20.000
3. Job: Zeilen 20.001 - 30.000.
,...
100. Job: Zeilen 990.001 - 1.000.000
Haubi hat geschrieben:Du solltest dabei nur darauf achten, dass nicht zu viele Prozesse gleichzeitig laufen - sonst steigt Dir die Basis bzw. die Anwender auf's Dach...