Code: Alles auswählen.
do row_count times. "row_count z.B. 60000
append initial line to itab.
enddo.
Warum erstellt man eine LEERE interne Tabelle mit ca. 60.000 Zeilen?abapz hat geschrieben:Hallo Zusammen,
ich muss eine ziemlich große interne Tabelle erstellen ( 200 Spalten, ~ 60000 Zeilen oder mehr) im batch erstellen.
Später greife ich hier mit Feldsymbolen zu, das spielt aber jetzt keine Rolle.Code: Alles auswählen.
do row_count times. "row_count z.B. 60000 append initial line to itab. enddo.
Ich bekomme den Fehler TSV_TNEW_PAGE_ALLOC_FAILED (über sm37, mit st22 verifiziert).
Über den Report RSPARAM:
ztta/roll_extension_non_dia auf 4026531840 (Doppelt so hoch wie der Defaultwert).
abap_heap_area_nondia 20000000.
in sm04 steigt der "speicherverbrauch" auf ca 4000.000 (Einheit nicht ersichtlich), anschließend kommt es zur Exception.
-----------
hat irgendwer eine idee?
Danke!
Warum sollte ich Dich belehren. Du hast mich doch gerade aufgeklaert, dass man es so macht, wie Du es machst und auch schneller ist.abapz hat geschrieben:wenn man vorher weiß, wieviele zeilen eine tabelle haben wird, so kann man diese zeilen "in einem rutsch" appenden, und anschließend mit pointern bzw "feldsymbolen" über die tabelle gehen und die daten hinzufügen. es ist durchaus so, dass es schneller ist, als mitten in einem loop eine wa zu befüllen und am schluss jeder loop-runde die wa zu appenden, und das system mittendrin merkt, dass es mehr speicher braucht.
P.S.: ich lasse mich gerne eines besseren belehren, falls dem in abap nicht so ist.
Code: Alles auswählen.
do row_count times. "row_count z.B. 60000
append initial line to itab.
enddo.
AMEN!Unit605 hat geschrieben:FYI: Ich habe und werde niemals so vorgehen und so einen leere interne Tabelle erstellen.
ich habs umprogrammiert (ohne 60000 mal append initial line) - dennoch kommt es zu demselben fehler (nachdem der hintergrundjob ca 3 stunden lief...).Wenn man die SAP-Hilfe genauer durchliest wird man feststellen, dass eine plötzliche hohe Speicheranforderung auch zu einem TSV_TNEW_PAGE_ALLOC_FAILED führen kann, obwohl die voreingestellte Höchstgrenze noch nicht erreicht ist.
ABAP kennt da den OCCURS N Zusatz bei der DATA-Definition der ITAB. Ist aber eigentlich obsolet.abapz hat geschrieben:ich bräuchte in der tat "malloc" oder wie z.b. in java bei arraylisten "initial capacity" - einen befehl, der einmalig einen großen speicherbereich reserviert.
JHM hat geschrieben:ABAP kennt da den OCCURS N Zusatz bei der DATA-Definition der ITAB. Ist aber eigentlich obsolet.abapz hat geschrieben:ich bräuchte in der tat "malloc" oder wie z.b. in java bei arraylisten "initial capacity" - einen befehl, der einmalig einen großen speicherbereich reserviert.
Vielleicht beschreibst du mal, was dein Programm genau macht. Dann könnte man auch gezielt Tipps geben.
60.000 Lines in einer ITAB sind jetzt ja eigentlich nix besonderes, da sollte der Speicher an sich nicht knapp werden.