Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firedac probleme mit Blob (https://www.delphipraxis.net/189773-firedac-probleme-mit-blob.html)

Kostas 19. Jul 2016 21:10

Datenbank: Firebird • Version: 2.5 • Zugriff über: Firedac

Firedac probleme mit Blob
 
Hallo Zusammen,

ich habe ein großes Problem mit Blobs.
In einer Tabellen sind Bilder in ein Blob-Feld abgelegt.

Alle Blobs bis auf eines werden korrekt ausgelesen.
Schaue ich mit IBExpert in die Tabelle Bilder rein, ist die kleine Grösse die das BilderDataSet.FieldByName('BILD').Size ausgibt exakt identisch.

Das Feld ist angelegt als FieldType=BlOB Size=1024 Suytype=Binary.

Er fällt auf dass der Stream genau um den Faktor 1024 größer ist. Ist das Zufall oder hat das was mit der definierten Blob-Größe von 1024 zu tun?

Delphi-Quellcode:
var TmpStream:TStream;
begin
  TmpStream := BilderDataSet.CreateBlobStream(BilderDataSet.FieldByName('BILD'),bmRead);

  cmAppendTarget.Params.ParamByName('BILD').LoadFromStream(TmpStream,ftBlob);

  Memo1.Lines.add(Format('SizeQ= %d SizeZ= %d',[BilderDataSet.FieldByName('BILD').Size, TmpStream.Size]));

  TmpStream.Free;
SizeQ= 20801 SizeZ= 20801
SizeQ= 19907 SizeZ= 19907
SizeQ= 23810 SizeZ= 23810
SizeQ= 31347 SizeZ= 32099328 <<<<Warum wird der Stream Faktor 1024 größer?
SizeQ= 24599 SizeZ= 24599
SizeQ= 18064 SizeZ= 18064
SizeQ= 15731 SizeZ= 15731
SizeQ= 15295 SizeZ= 15295
SizeQ= 12934 SizeZ= 12934
SizeQ= 26518 SizeZ= 26518
SizeQ= 4787 SizeZ= 4787
SizeQ= 7283 SizeZ= 7283
SizeQ= 26060 SizeZ= 26060
SizeQ= 22652 SizeZ= 22652

hat jemand eine Idee?
Gruß Kostas

Uwe Raabe 19. Jul 2016 22:02

AW: Firedac probleme mit Blob
 
Sieht so aus, als liege es an diesem speziellen Bild.

Kostas 19. Jul 2016 22:39

AW: Firedac probleme mit Blob
 
Hallo Uwe,

könnte schon sein, aber einem Blob sollte doch egal sein welcher Inhalt verwaltet wird. Ich habe das Bild nicht geladen sondern rein als Blob abgerufen.
Das interessante dabei ist, in der Tabelle ist das Bild noch klein. Es fällt auf dass der Stream das Bild um den Faktor zufällig? 1024 vergrößert. Zufällig ist die Felddefinition in der DB auf 1024.
Auch ist auffällig dass die Orignalgröße vom Bild die größte von allen andern Bildern ist.

Ich werde morgen weitere Bilder in die DB importieren die auch grösser sind. Mal sehen was passiert.
Gibt es Richtlinien wie die Größe der Blob Felder berechnet werden soll bei Firebird? Irgend wo habe ich mal davon gelesen. Im Idealfall sollte die Größe des Bildes ein vielfacher der Feldgröße sein vermutlich. Doch bei Bildern kann ich das unmöglich vorgeben.

Gruß Kostas

hoika 20. Jul 2016 07:06

AW: Firedac probleme mit Blob
 
Hallo,
die Blob_Size hat noch historische Gründe.
siehe hier zu Blob_Size 80 = Terminalzeichen pro Zeile

https://www.ibphoenix.com/resources/...general/doc_54

Intern in FB wird ein Puffer mit genau dieser Größe angelegt und immer diese Größe in den Puffer geladen.
Bei Blob_Size 80 und einer Größe des Blobs von 90 Byte wird also hintereinander einmal die 80 Byte
in einen statischen Puffer (char[80]) geladen, und wenn es mehr als 80 Byte sind,
ein zweiter 2., dynamischen Puffer benutzt.
Der statische Puffer ist natürlich schneller.

Wenn der Blob i.d.R. nur 80 Byte hat, reicht Puffer 1,

Beim Client kommen aber die 90 Byte an.

(Ob das immer noch so ist, weiss ich nicht.)

Versuch doch mal hiermit die Größe direkt über FB zu ermitteln
http://stackoverflow.com/questions/4...ld-in-firebird
( OCTET_LENGTH() )

Heiko

mkinzler 20. Jul 2016 07:30

AW: Firedac probleme mit Blob
 
Nicht nur historische sondern vorallem ein Performancefaktor. (Level 0,1 2)

http://www.ibexpert.net/ibe_de/index.php?n=Doku.BLOB

Uwe Raabe 20. Jul 2016 07:41

AW: Firedac probleme mit Blob
 
Zitat:

Zitat von Kostas (Beitrag 1343024)
könnte schon sein, aber einem Blob sollte doch egal sein welcher Inhalt verwaltet wird. Ich habe das Bild nicht geladen sondern rein als Blob abgerufen.

Sorry, ich wollte damit eigentlich andeuten, daß uns der Zugriff auf dieses Bild eventuell ein Debugging ermöglicht. An dem Code ist ja generell nichts auszusetzen. Deswegen kann es natürlich immer noch an der Implementation liegen, aber eben nur in Kombination mit diesem einen Bild.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz