gelöst Interne Tabelle hat keine Speicher mehr


Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Moderatoren: Jan, Steff

gelöst Interne Tabelle hat keine Speicher mehr

Beitragvon Wess » 05.11.2018, 11:36

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.
Wess
ForumUser
 
Beiträge: 5
Registriert: 05.11.2018, 10:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Interne Tabelle hat keine Speicher mehr

Beitragvon wreichelt » 05.11.2018, 13:50

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
wreichelt
Expert
 
Beiträge: 635
Registriert: 17.07.2005, 09:46
Wohnort: Hessen
Dank erhalten: 105 mal
Ich bin: sonstiges

Re: Interne Tabelle hat keine Speicher mehr

Beitragvon Wess » 05.11.2018, 14:43

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
Wess
ForumUser
 
Beiträge: 5
Registriert: 05.11.2018, 10:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Interne Tabelle hat keine Speicher mehr

Beitragvon wreichelt » 05.11.2018, 15:04

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
wreichelt
Expert
 
Beiträge: 635
Registriert: 17.07.2005, 09:46
Wohnort: Hessen
Dank erhalten: 105 mal
Ich bin: sonstiges

Re: Interne Tabelle hat keine Speicher mehr

Beitragvon Wann » 06.11.2018, 11:12

Du suchst vermutlich PACKAGE SIZE n im Zusammenhang mit dem Select-Befehl.
Wann
ForumUser
 
Beiträge: 23
Registriert: 08.01.2015, 09:37
Dank erhalten: 6 mal
Ich bin: Entwickler/in

Re: Interne Tabelle hat keine Speicher mehr

Beitragvon Wess » 07.11.2018, 09:55

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 ="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">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 ;)
Wess
ForumUser
 
Beiträge: 5
Registriert: 05.11.2018, 10:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in


Zurück zu ABAP Objects®

  Aktuelle Beiträge   
Java & Bildbearbeitung
vor 13 Stunden von Madredure 0 Antw.
Call Transaction WE20 mit Werteübergabe
vor 11 Stunden von ewx 1 Antw.
Vergleich Customizing Tabellen auf zwei Systemen
vor 13 Stunden von ewx 2 Antw.
Empfehlung Antiviren-Programm?
vor 14 Stunden von Madredure 2 Antw.
BADI im Customizing finden
Gestern von Romaniac 0 Antw.

  Ähnliche Beiträge beta
Zugriff auf interne Tabelle
02.11.2006, 08:27 von Heiner Tiling 4 Antw.
interne Tabelle dynamisch anlegen
02.11.2006, 09:37 von DeathGuardian 8 Antw.
interne tabelle mit objektreferenzen exportieren
29.11.2006, 13:40 von rambozola 2 Antw.
Interne Tabelle dynamisch generieren
22.10.2008, 15:36 von inab 8 Antw.
Interne Tabelle als XML-Datei versenden
27.07.2017, 09:02 von debianfan 5 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot]