[Gelöst] Performance/Error mit OutStream & BLOB

26. Juni 2008 15:45

Hallo,

ich habe ein Problem beim Schreiben von XML Daten in BLOB Felder via Streams. Die Schwierigkeiten treten erst ab einer gewissen Groese der einzulesenden XML Datei auf.
Files < ~700KB werden schnell und ohne Probleme eingelesen und gespeichert, sind sie groeser, verlangsamt sich das Programm massiv (~1KB/sec) und bei 770KB verabschiedet er sich mit dem Fehler, dass die DB voll ist, :roll: was natuerlich nicht stimmt.

Das Programm ist so aufgebaut:
Die Daten lese ich aus einer Queue (MQ Series) schrittweise (bei jedem loop 300 Zeichen) aus.
Beim ersten Durchlauf erstelle ich einen Record in der Tabelle "EDI Message" und oeffne einen Stream auf das BLOB Feld "EDI Content".
Jetzt fuegt er laufend Teilstrings hinzu und speichert den Record immer wieder ab.

Ich habe testweise nach jedem Modify ein Commit gesetzt. So bringt er keinen Error am Schluss, wird allerdings noch langsamer.

Dateien mit ~1MB sind eigentlich nicht gross, und wenn man bedenkt, dass ein BLOB Feld ~2GB aufnehmen kann, dann wundert mich das schon etwas. :-?


Code:
// readqueue()


    FOR i := 1 TO ROUND(RecMessage.MessageLength/MsgLen,1,'>') DO BEGIN
      IF RecMessage.DataLength >= MsgLen THEN BEGIN                  // ReadString kann nicht mehr auslesen, als vorhanden ist. Dann wuerde
        TextIn := RecMessage.ReadString(MsgLen);                     // er nichts mehr auslesen! -> DataLength verwenden, nicht MessageLength
        writetable(TextIn);
      END ELSE BEGIN
        TextIn := RecMessage.ReadString(RecMessage.DataLength);
        writetable(TextIn);
      END;




Code:
// writetable(Msg)

  IF i = 1 THEN BEGIN
    MQFunc.MQMsgCreate(EDIMessage,NewCode,'','','XML','IN');        // Record wird erstellt
   
    CLEAR(OutStrm);
    EDIMessage.CALCFIELDS("EDI Content");
    EDIMessage."EDI Content".CREATEOUTSTREAM(OutStrm);              // Stream oeffnen
  END;

  OutStrm.WRITETEXT(Msg);                                           // Schreibe Msg in BLOB Feld
 
  EDIMessage.MODIFY();




Dieses Problem habe ich in NAV5.00 und NAV3.60 festgestellt.

Testweise habe ich die Daten nur in ein TXT File auf die Platte geschrieben, und das Speichern in Navision auskommentiert, dann ist er in <1sec fertig. Die MQ Automation kann also nicht Schuld sein.

Hat jemand Loesungsvorschlaege oder sonstige Ideen?


Gruesse
feri
Zuletzt geändert von feri am 30. Juni 2008 15:34, insgesamt 1-mal geändert.

30. Juni 2008 15:34

Hi,

ich habe den Fehler jetzt beheben koennen.
Die Ursache war das MODIFY(). Offensichtlich vertraegt sich der BLOB Stream nicht so gut mit dem MODIFY im Loop.

Nachdem ich das alles erst am Schluss mit MODIFY abschliesse, laeuft es deutlich schneller und bricht auch nicht mit einem Fehler ab.

Bei dem Programm gibt es noch einen Teil, bei dem ein strukturierter Text eingelesen wird, dabei speichere ich das in einer Tabelle ohne BLOB. Hier muss ich dann bei jedem Loop abspeichern. Da klappt das auch mit ~80MB Files ganz gut.

Die Geschwindigkeit beim BLOB ist jetzt zwar besser, aber richtig schnell ist es immer noch nicht.

Naja, man kann nicht alles haben. :roll:


Gruesse
feri