Interne Tabelle hat keine Speicher mehr

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Interne Tabelle hat keine Speicher mehr

Beitrag von Wess (ForumUser / 26 / 4 / 0 ) »
Hallo Kollegen,
dies ist mein erste Nachricht in diesem Forum :)

Thema ist: ein CSV Datei mit 52 Millionen Einträge uploaden, bearbeite, und in anderen 2 Tabellen speichern.

Ich habe 3 Programme geschrieben die folgendes machen:
Erste Programm: Uploadet eine CSV Datei mit 52 Millionen Einträge entweder Frontend(Lokal) oder Backend(von System).
Zweite Programm: Transformiert die Einträge. Das heißt, Einträge werden bearbeitet etc..
Dritte Programm: die ok Einträge bekommen ein Status und werden in 2 Tabellen gespeichert.
Ist egal, jetzt kommen wir zum unseren Thema :D
Ich habe die Programmen erstmals mit kleinen Menge getestet und hat alles geklappt. Danach habe ich sie wieder mit 5 Millionen Einträge getestet und die Erste Programm hat gut geklappt, das heißt alle Einträge wurden schon hochgeladen und in die Tabelle gespeichert aber der zweite Programm hat nicht geklappt weil da die Interne Tabelle voll war. Der Basis Team hat die Speicher schon auf 10 GB hochgesetzt. Aber ich möchte, dass meine Programm verbessern dass es ohne Hilfe Funktionieren werden kann.
Die Frage ist: was von Ideen habt Ihr für die Problem dass der Programm gut und schnell arbeitet.
Ich wollte jetzt so machen, dass ich counter machen und jedes mal nach 1 Million Einträge bearbeite ich die Einträge und speichere ich sie in die Tabelle denn lösche ich die gelesene Einträge von die Tabelle und usw. bis ich die 52 Mill Einträge bearbeite...

Was habt Ihr von anderen Ideen die mir helfen kann.
Danke im Voraus.

Für Interesse hier ist mein zweite Programm. Die Interne Tabelle lt_updated_lines macht den ganzen Problem, die wird voll (APPEND ls_ztoa01otxcoi TO lt_updated_lines).

Code: Alles auswählen.

SELECT * FROM  ztoa01otxcoi
               INTO TABLE lt_ztoa01otxcoi
               WHERE status = '1'.

SELECT toadv~ar_object, toadv~doc_type, toasp~objecttext               " alle ar_object in lt_archive_objects speichern
       FROM toadv
       LEFT JOIN toasp ON toasp~ar_object = toadv~ar_object
       INTO TABLE @DATA(lt_archive_objects)
       WHERE language = 'D'.

IF lt_ztoa01otxcoi[] IS NOT INITIAL.
  DATA: lt_aida TYPE TABLE OF but0id-idnumber.
  LOOP AT lt_ztoa01otxcoi ASSIGNING FIELD-SYMBOL(<lfs_ztoa01otxcoi>).
    APPEND <lfs_ztoa01otxcoi>-aida TO lt_aida.
  ENDLOOP.
  SELECT idnumber, partner                                              "Ermittelt die Partnernummer von die BUT0id Tabelle wenn die AIDA nummer = idnumber
         FROM but0id
         INTO TABLE @lt_but0id
         FOR ALL ENTRIES IN @lt_aida
         WHERE type = 'ZAIDA'
           AND idnumber = @lt_aida-table_line.
ENDIF.


LOOP AT lt_ztoa01otxcoi INTO ls_ztoa01otxcoi.

  CASE ls_ztoa01otxcoi-storagetype.
    WHEN '1'.
      ls_ztoa01otxcoi-zw_reserve = 'PDF'.
    WHEN '2'.
      ls_ztoa01otxcoi-zw_reserve = 'JPG'.
    WHEN '3'.
      ls_ztoa01otxcoi-zw_reserve = 'TIFF'.
    WHEN '4'.
      ls_ztoa01otxcoi-zw_reserve = 'DOC'.
    WHEN '5'.
      ls_ztoa01otxcoi-zw_reserve = 'PPT'.
    WHEN '6'.
      ls_ztoa01otxcoi-zw_reserve = 'XLS'.
    WHEN '7'.
      ls_ztoa01otxcoi-zw_reserve = 'MSG'.
    WHEN '8'.
      ls_ztoa01otxcoi-zw_reserve = 'GIF'.
    WHEN '9'.
      ls_ztoa01otxcoi-zw_reserve = 'HTM'.
  ENDCASE.


  LOOP AT lt_archive_objects ASSIGNING FIELD-SYMBOL(<lfs_archive_object>)           "Ermittelt das richtige ar_object
       WHERE doc_type = ls_ztoa01otxcoi-zw_reserve
         AND objecttext CS ls_ztoa01otxcoi-zw_belegart
         AND ar_object CS 'ZBPCOI'.
    EXIT.
  ENDLOOP.

  IF sy-subrc IS INITIAL AND <lfs_archive_object> IS ASSIGNED.
    ls_ztoa01otxcoi-zw_ar_object = <lfs_archive_object>-ar_object.
  ENDIF.

  CLEAR: lv_partnrcount, ls_but0id.
  LOOP AT lt_but0id INTO ls_but0id
       WHERE idnumber = ls_ztoa01otxcoi-aida.
    lv_partnrcount = lv_partnrcount + 1.
  ENDLOOP.

  IF lv_partnrcount = 1.
    ls_ztoa01otxcoi-zw_obj_id = ls_but0id-partner.
  ENDIF.


  IF ls_ztoa01otxcoi-zw_obj_id IS NOT INITIAL
                               AND ls_ztoa01otxcoi-zw_ar_object IS NOT INITIAL
                               AND ls_ztoa01otxcoi-zw_reserve   IS NOT INITIAL
                               AND lv_partnrcount = 1.
    ls_ztoa01otxcoi-status = '2'.
    lv_count = lv_count + 1.
  ELSE.
    ls_ztoa01otxcoi-status = '4'.
  ENDIF.

  APPEND ls_ztoa01otxcoi TO lt_updated_lines.
  CLEAR: lv_partnrcount, ls_ztoa01otxcoi.

ENDLOOP.

LOOP AT lt_updated_lines INTO ls_temp.
  APPEND ls_temp TO lt_temp.
  count_eintraege = count_eintraege + 1.
  IF count_eintraege MOD 50000 = 0 OR count_eintraege EQ lines( lt_updated_lines ).
    UPDATE ztoa01otxcoi FROM TABLE lt_temp.
    COMMIT WORK.
    CLEAR lt_temp.

  ENDIF.
ENDLOOP.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Interne Tabelle hat keine Speicher mehr

Beitrag von wreichelt (Top Expert / 1031 / 29 / 188 ) »
Hallo,

ich würde die Tabelle mit einem READ ... Index 1 lesen.

Nach der Versrbeitung den Index um eins erhöhen und den nächsten Satz verarbeiten. Usw.

Gruß Wolfgang

Re: Interne Tabelle hat keine Speicher mehr

Beitrag von Wess (ForumUser / 26 / 4 / 0 ) »
Hallo Wolfgang,

Danke für Ihre Antwort.
Ich weiß, dass es so funktioniert ist. Aber wenn ich jede Eintrag einzel bearbeite und danach in die Tabelle updaten dauert es so lang. Deswegen möchte ich z.B 1 Million Eintrag von die Tabelle lesen denn bearbeiten und updaten und danach lese ich die Nächsten 1 Million Einträge Usw.
Wie kann ich das genau machen? Wie kann mann jedes mal bur ein bestimmte menge von die Tabelle lesen!! (mit select up to... !!)

Gruß,
Wess

Re: Interne Tabelle hat keine Speicher mehr

Beitrag von wreichelt (Top Expert / 1031 / 29 / 188 ) »
Hallo,

das geht auch mit Loop


DATA: BEGIN OF T OCCURS 100,
BAREA(5), BLNCE(5),
END OF T.

LOOP AT T FROM 7 TO 8.
WRITE: / T-BAREA, T-BLNCE.
ENDLOOP.

Gruß Wolfgang

Re: Interne Tabelle hat keine Speicher mehr

Beitrag von Wann (ForumUser / 57 / 3 / 15 ) »
Du suchst vermutlich PACKAGE SIZE n im Zusammenhang mit dem Select-Befehl.

Re: Interne Tabelle hat keine Speicher mehr

Beitrag von Wess (ForumUser / 26 / 4 / 0 ) »
Hallo,

es ist schon gelöst ;)
Wolfgang das geht nicht mit dem Loop weil das problem ist, die Tabelle hat 52 Million Einträge (mehr als 10 GB) und wenn ich mit Loop arbeite die interne Tabelle wird voll und bekomme ich ein Fehlermeldung. die Basis Team kann die Speicher schon erhöhen aber wollte alleine ein Lösung haben.

So kannst du jedes mal 100000 Linie von die Tabelle selektieren und bearbeiten danach geht es wieder zum nächsten 100000 Usw....

Lösung ist:

Code: Alles auswählen.

DATA: lv_package_size    TYPE i,
          lv_cursor    TYPE cursor.
   

lv_package_size = 100000.

OPEN CURSOR WITH HOLD lv_cursor FOR
  SELECT * FROM Tabelle

DO.
  FETCH NEXT CURSOR lv_cursor
      INTO TABLE Interne_tabelle PACKAGE SIZE lv_package_size.          "100000 Linie

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  .............
schreib hier dein Code etc....

Danach falls du APPEND und UPDATE brauchst, sollst du danach kein COMMIT WORK verwenden weil es funktioniert mit OPEN CURSOR nicht. Hier kann man die Fnktionsbaustein DB_COMMIT verwenden (sie macht COMMIT WORK).

ENDDO.
CLOSE CURSOR lv_cursor.
Danke und Gruß,
Wissem ;)

Seite 1 von 1

Vergleichbare Themen

9
Antw.
3612
Views
Tabelle-Speicher-Event - zugreiffbar?
von Sapianer » 30.08.2011 16:20 • Verfasst in ABAP® Core
4
Antw.
227
Views
5
Antw.
1247
Views
Inhalt interne Tabelle an andere interne Tabelle übergeben
von L0w-RiDer » 30.01.2020 16:28 • Verfasst in ABAP® für Anfänger
5
Antw.
3004
Views
interne Tabelle in andere interne Tabelle (Format)
von Gast » 20.10.2004 14:44 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141