Reduce memory consumption during deserialize (#4357)

* Reduce memory consumption during deserialize

Import of objects required unnecessarily a lot of memory. This was the especially the case during the initial import of repos with large (binary) objects or high number of objects (even if they were not under /src/). 

With this fix, an instance of an object serializer now contains only the files associated with this object (rather than all (!) files of the repo).

* Change path logic

* Comment

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2020-12-30 02:59:41 -05:00 committed by GitHub
parent 98ecc1a51c
commit 6dfa4eee17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 16 deletions

View File

@ -84,7 +84,10 @@ CLASS zcl_abapgit_objects_files DEFINITION
!iv_extra TYPE clike OPTIONAL
!iv_ext TYPE string
RETURNING
VALUE(rv_present) TYPE abap_bool.
VALUE(rv_present) TYPE abap_bool .
METHODS get_file_pattern
RETURNING
VALUE(rv_pattern) TYPE string .
PROTECTED SECTION.
METHODS read_file
@ -273,6 +276,11 @@ CLASS zcl_abapgit_objects_files IMPLEMENTATION.
ENDMETHOD.
METHOD get_file_pattern.
rv_pattern = filename( iv_ext = '*' ).
ENDMETHOD.
METHOD read_abap.
DATA: lv_filename TYPE string,
@ -381,6 +389,20 @@ CLASS zcl_abapgit_objects_files IMPLEMENTATION.
METHOD set_files.
mt_files = it_files.
FIELD-SYMBOLS: <ls_file> LIKE LINE OF it_files.
CLEAR mt_files.
" Set only files matching the pattern for this object
" If a path has been defined in the constructor, then the path has to match, too
LOOP AT it_files ASSIGNING <ls_file> WHERE filename CP get_file_pattern( ).
IF mv_path IS INITIAL.
INSERT <ls_file> INTO TABLE mt_files.
ELSEIF mv_path = <ls_file>-path.
INSERT <ls_file> INTO TABLE mt_files.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -8,14 +8,17 @@ CLASS ltcl_objects_files DEFINITION FOR TESTING
METHODS get_program_data
IMPORTING
iv_line_break TYPE clike
RETURNING VALUE(rv_result) TYPE xstring.
iv_line_break TYPE clike
RETURNING
VALUE(rv_result) TYPE xstring.
METHODS get_xml_data
RETURNING VALUE(rv_result) TYPE xstring.
RETURNING
VALUE(rv_result) TYPE xstring.
METHODS get_expected_abap_source
RETURNING VALUE(rt_result) TYPE abaptxt255_tab.
RETURNING
VALUE(rt_result) TYPE abaptxt255_tab.
METHODS read_abap FOR TESTING
RAISING
@ -25,13 +28,14 @@ CLASS ltcl_objects_files DEFINITION FOR TESTING
RAISING
cx_static_check.
METHODS get_file_pattern FOR TESTING.
ENDCLASS.
CLASS ltcl_objects_files IMPLEMENTATION.
METHOD setup.
DATA: lt_files TYPE zif_abapgit_definitions=>ty_files_tt,
ls_item TYPE zif_abapgit_definitions=>ty_item.
ls_item TYPE zif_abapgit_definitions=>ty_item.
FIELD-SYMBOLS: <ls_files> LIKE LINE OF lt_files.
APPEND INITIAL LINE TO lt_files ASSIGNING <ls_files>.
@ -96,15 +100,15 @@ CLASS ltcl_objects_files IMPLEMENTATION.
METHOD read_xml.
DATA: BEGIN OF ls_exp_prog_metadata,
name TYPE progname VALUE 'ZLF',
subc(1) TYPE c VALUE '1',
rload(1) TYPE c VALUE 'E',
fixpt(1) TYPE c VALUE 'X',
uccheck(1) TYPE c VALUE 'X',
END OF ls_exp_prog_metadata,
ls_act_prog_metadata LIKE ls_exp_prog_metadata,
ls_exp_metadata TYPE zif_abapgit_definitions=>ty_metadata,
li_xml TYPE REF TO zif_abapgit_xml_input.
name TYPE progname VALUE 'ZLF',
subc(1) TYPE c VALUE '1',
rload(1) TYPE c VALUE 'E',
fixpt(1) TYPE c VALUE 'X',
uccheck(1) TYPE c VALUE 'X',
END OF ls_exp_prog_metadata,
ls_act_prog_metadata LIKE ls_exp_prog_metadata,
ls_exp_metadata TYPE zif_abapgit_definitions=>ty_metadata,
li_xml TYPE REF TO zif_abapgit_xml_input.
ls_exp_metadata-class = 'LCL_OBJECT_PROG'.
ls_exp_metadata-version = 'v1.0.0'.
@ -119,4 +123,12 @@ CLASS ltcl_objects_files IMPLEMENTATION.
ENDMETHOD.
METHOD get_file_pattern.
cl_abap_unit_assert=>assert_equals(
exp = 'zlf.prog.*'
act = mo_cut->get_file_pattern( ) ).
ENDMETHOD.
ENDCLASS.