Skip to main content

Compacting internal memory of SAP tables in ABAP.

How to force-free memory from deleted entries in internal tables in SAP ABAP, since the garbage collector won't touch these. This is only needed in rare occasions and/or when memory fragmentation needs to be avoided.
This method will do it fast, and correctly:

CLASS cl_demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS compact CHANGING ct_tab TYPE ANY TABLE.
ENDCLASS.

CLASS cl_demo IMPLEMENTATION.
  METHOD compact.
    FIELD-SYMBOLS: <lt_buffer>      TYPE ANY TABLE,
                   <lt_buffer_std>  TYPE STANDARD TABLE,
                   <ls_buffer>      TYPE any,
                   <ls_buffer_prev> TYPE any.

    DATA: ltr_buffer TYPE REF TO data,
          lsr_buffer TYPE REF TO data,
          l_kind     TYPE c LENGTH 1.

    " simple case:
    IF ct_tab IS INITIAL.
      FREE ct_tab.
      RETURN.
    ENDIF.

    CREATE DATA ltr_buffer LIKE ct_tab.

    DESCRIBE TABLE ct_tab KIND l_kind.
    CASE l_kind.
      WHEN sydes_kind-standard.

        ASSIGN ltr_buffer->* TO <lt_buffer_std>.
        <lt_buffer_std> = ct_tab.

        " this will create/copy a new instance of the table
        APPEND INITIAL LINE TO <lt_buffer_std>.
        DELETE <lt_buffer_std> INDEX sy-tabix.

        ct_tab = <lt_buffer_std>.

      WHEN OTHERS. " hased / sorted (unique/non-unique)

        ASSIGN ltr_buffer->* TO <lt_buffer>.
        <lt_buffer> = ct_tab.

        LOOP AT <lt_buffer> ASSIGNING <ls_buffer>.
          " this is done only once: work with a actual line copy
          CREATE DATA lsr_buffer LIKE LINE OF ct_tab.
          ASSIGN lsr_buffer->* TO <ls_buffer_prev>.
          <ls_buffer_prev> = <ls_buffer>.

          " this will create/copy a new instance of the table (slow for sorted/hashed)
          DELETE TABLE <lt_buffer> FROM <ls_buffer_prev>.
          INSERT <ls_buffer_prev> INTO TABLE <lt_buffer>.

          EXIT.
        ENDLOOP.

        ct_tab = <lt_buffer>.

    ENDCASE.

    " For immediate garbage collection (when trying to prevent fragmentation):
    " Run: cl_abap_memory_utilities=>do_garbage_collection( ).

  ENDMETHOD.

Comments

Popular posts from this blog

My Custom Mechanical 60% Keyboard Build

My Custom Mechanical 60% Keyboard Build All the parts   1x GH60 (Satan) board - $35 61x Cherry Clear switches  - $35 2x Cherry Blue switches - $3 10x Cherry Red switches - $10 1x PCB Stabilizer set (6.25 space) - $6 1x Royal Oak Glam 60% case (Black Walnut) - $78 1x Aluminium 60% plate - $19 1x SA profile Choclatier keycaps - $102 ( base, modifiers, and novelties ) 1x Braided Nylon USB cable - $15 Solder, Tools, Risers, Labor, etc. Total: ± $300 (Other single switch types added as needed) Testing the board I had my helper do the work here. We needed to test the board before applying any solder. Assembling Add the stabilizers first Add the plate (using a few switches as spacers) Then add the rest Solder solder solder... And test again: The casing The casing I received did to have built-in risers: So I added my own: Then Assemble (using temporary spare GMK Carbon Cherry-profile k...

Lock Screen on Mac OS X using keyboard shortcut.

1. Download "Global Hotkey" 2. Create a folder "Global Hotkey" and copy contents of downloaded DMG to that. 3. In a terminal do: cd "/Applications/Global Hotkey" ln -s /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app "command f10" 4. Make sure Screensaver is set to prompt for password (you may need to relog for this to take effect) 5. Preferences -> Accounts -> -> Login Items : Add "Global Hotkey.app" 6. Launch the app as well