2016-04-20 10 views
1

Ich muss eine sehr große Zeichenfolge in der Backend-Tabelle unter einem Feld des Typs Zeichenfolge speichern.Textdatei in DB-Tabelle speichern mit oData

Die Zeichenfolge, die ich speichere, ist über 10 Millionen (1 crore) Zeichenlänge. Das Speichern und Abrufen aus dem Back-End dauert lange.

Ich habe versucht, Algorithmen zu komprimieren, die so große Zeichenfolge nicht komprimieren konnten. Also, was ist der beste Weg, um mit dieser Situation umzugehen und die Leistung zu verbessern.

Eingesetzte Technologien:

  • Frontend - SAP UI5,
  • Gateway - OData,
  • Backend - SAP ABAP.

Komprimierung Methoden versucht:

https://github.com/tcorral/JSONC
https://github.com/floydpink/lzwCompress.js

die oben Kompressionsverfahren nicht in der Lage waren, mein Problem zu lösen.

+0

Kommt diese Zeichenfolge vom Frontend? Wenn ja, können Sie es möglicherweise im Backend zum Speichern generieren? – hirse

+0

hirse, es kommt vom Frontend. Ich lese ein Excel-Blatt, konvertiere es dann in den JSON und speichere es als String. –

+0

Können Sie nicht einfach die Excel-Datei hochladen und speichern? XLSX-Dateien sind grundsätzlich ZIP-Dateien, daher sind sie möglicherweise kleiner als Ihr JSON. – Marc

Antwort

0

Nun, Marc ist richtig, dass die Übertragung XLSX ist definitiv besser/schneller als JSON.
ABAP JSON-Tools sind nicht so reich aber für die meisten Manipulationen ausreichend. Weitere besondere Aufgaben können über interne Tabellen und Transformationen erledigt werden. Es wird daher dringend empfohlen, Ihre Operationen (XLSX >> JSON) auf dem Backend-Server auszuführen.

Was betrifft Backend DB-Tabelle, ich unterstütze Chris N, dass das Einfügen von 10M String in String-Feld ist eine schlechteste Idee, die jemals vorgestellt werden kann. Die empfohlene Methode zum Speichern großer Dateien in transparenten Tabellen ist XSTRING type. Dies ist eine Art von BLOB für ABAP, die im Umgang mit binären Daten viel schneller ist.

Ich habe einige SAT Leistungstests auf meinem Beispiel 14-Millionen-Datei gemacht und das ist, was ich habe.

INSERT in XSTRING Feld:

enter image description here

INSERT in STRING Feld:

enter image description here

Wie Sie DB-Operationen Netto-Zeit unterscheidet sich für deutlich wahrnehmen kann, nicht von STRING.

Der Upload-Code kann wie folgt aussehen:

DATA: len type i, 
     lt_content TYPE standard table of tdline, 
     ws_store_tab TYPE zstore_tab. 

"Upload the file to Internal Table 
call function 'GUI_UPLOAD' 
    exporting 
    filename    = '/TEMP/FILE.XLSX' 
    filetype    = 'BIN' 
importing 
    filelength    = len 
tables 
    data_tab    = lt_content 
. 

IF sy-subrc <> 0. 
message 'Unable to upload file' type 'E'. 
ENDIF. 

"Convert binary itab to xstring 
call function 'SCMS_BINARY_TO_XSTRING' 
exporting 
    input_length  = len 
    FIRST_LINE   = 0 
    LAST_LINE   = 0 
    importing 
    buffer    = zstore_tab-file  "should be of type XSTRING! 
TABLES 
    binary_tab  = gt_content 
exceptions 
failed    = 1 
others    = 2 
     . 
IF sy-subrc <> 0. 
MESSAGE 'Unable to convert binary to xstring' type 'E'. 
ENDIF. 

INSERT zstore_tab FROM ws_store. 

IF sy-subrc IS INITIAL. 
MESSAGE 'Successfully uploaded' type 'S'. 
ELSE. 
MESSAGE 'Failed to upload' type 'E'. 
ENDIF. 

Für das Parsen und Manipulieren XLSX mehr AS ABAP-Wrapper bereits vorhanden ist, Beispiele sind here, here und here.

All dies ist über Backend-Seite Optimierung. Optimierung auf dem Frontend sind willkommen von UI5-Experten (zu denen ich nicht gehörend), aber allgemeine SAP-Empfehlung ist es, alle massiven Manipulation zu Anwendungsserver zu bewegen.