Binärdaten in PostgreSQL Datenbank schreiben. Beste Methode?
Verfasst: 03.07.2014 13:16
Hallo,
ich habe hier mal 3 Möglichkeiten, Binärdaten in eine PostgreSQL Datenbank zu schreiben vorbereitet.
Wenn überhaupt, welche der 3 Methoden würdet ihr benutzen?
Ich frage deswegen, weil ich keinen "Festplatten- Füller" programmieren möchte.
1. Möglichkeit: Ganz normal Database blob
Laut PB- Hilfe sollte diese Methode aber so nicht benutzt werden??
2. Möglichkeit Database blob und Base64 kodiert
Diese Methode zeigt jedoch einen höheren Speicherverbrauch, natürlich wegen der Kodierung.
3.Möglichkeit die Daten in einen String kodieren und als Type text in die Db schreiben. Verbraucht allerdings mit Unicode den doppelten Speicher in der DB.
Die Debugger- Ausgabe:
Ihr müsst natürlich noch testbild.jpg und postgres Passwort im Code ersetzen.
Gruß, Micha122
ich habe hier mal 3 Möglichkeiten, Binärdaten in eine PostgreSQL Datenbank zu schreiben vorbereitet.
Wenn überhaupt, welche der 3 Methoden würdet ihr benutzen?
Ich frage deswegen, weil ich keinen "Festplatten- Füller" programmieren möchte.
1. Möglichkeit: Ganz normal Database blob
Code: Alles auswählen
EnableExplicit
Define Mem_Size, bytes_gelesen, *Mem_Zeiger
;######### Testbild in den Speicher laden #########
If ReadFile(0,"testbild.jpg")
Mem_Size=Lof(0)
*Mem_Zeiger=AllocateMemory(Mem_Size)
bytes_gelesen=ReadData(0,*Mem_Zeiger,Mem_Size)
Debug "Speicherverbrauch ohne Base64"
Debug "Größe im Speicher : " + bytes_gelesen
Else
Debug "Bild konnte nicht geöffnet werden"
End
EndIf
CloseFile(0)
;######### Bild in PostgreSQL Db schreiben #########
UsePostgreSQLDatabase()
If OpenDatabase(0, "host=localhost port=5432 dbname=postgres", "postgres", "***Paßwort****")
DatabaseUpdate(0,"create table bilder (bild bytea);")
SetDatabaseBlob(0, 0, *Mem_Zeiger, Mem_Size)
DatabaseUpdate(0, "INSERT INTO bilder (bild) values ($1);")
Else
Debug DatabaseError()
EndIf
;######### Bild aus Db lesen #########
*Mem_Zeiger=ReAllocateMemory(*Mem_Zeiger,Mem_Size)
If DatabaseQuery(0, "SELECT * FROM bilder")
FirstDatabaseRow(0)
Mem_Size=DatabaseColumnSize(0,0)
Debug "Bildgröße in der Db :" + Mem_Size
GetDatabaseBlob(0,0,*Mem_Zeiger, Mem_Size)
FinishDatabaseQuery(0)
EndIf
DatabaseUpdate(0,"drop table bilder;")
CloseDatabase(0)Die Debugger- Ausgabe zeigt aber keinen erhöhten Speicherverbrauch in der DB.Hinweis: PostgreSQL verwendet BYTEA zum Speichern großer Objekte. Das "Escaping" (Sperren), was zum Speichern binärer Daten in einem solchen Feld benötigt wird, macht es oft größer als nötig. Eine gute Möglichkeit zum Speichern binärer Daten ist es, diese mit Base64Encoder() zu verschlüsseln, bevor sie an den Datenbank-Manager übergeben werden.
Code: Alles auswählen
Speicherverbrauch ohne Base64
Größe im Speicher : 51753
Bildgröße in der Db :51753Code: Alles auswählen
EnableExplicit
Define Mem_Size, bytes_gelesen, *Mem_Zeiger, *Ausgabe_Zeiger, Size, Size_Neu
;######### Testbild in den Speicher laden #########
If ReadFile(0,"testbild.jpg")
Mem_Size=Lof(0)
*Mem_Zeiger=AllocateMemory(Mem_Size)
bytes_gelesen=ReadData(0,*Mem_Zeiger,Mem_Size)
Debug "Speicherverbrauch mit Base64"
Debug "Größe im Speicher : " + bytes_gelesen
Else
Debug "Bild konnte nicht geöffnet werden"
End
EndIf
CloseFile(0)
;######### Speicher Base64 kodieren########
*Ausgabe_Zeiger= AllocateMemory(Mem_Size * 1.35)
Size=Base64Encoder(*Mem_Zeiger,Mem_Size,*Ausgabe_Zeiger,Mem_Size * 1.35)
Debug "Größe Base64 kodiert : " + Size
;######### Bild in PostgreSQL Db schreiben #########
UsePostgreSQLDatabase()
If OpenDatabase(0, "host=localhost port=5432 dbname=postgres", "postgres", "***Paßwort***")
DatabaseUpdate(0,"create table bilder (bild bytea);")
SetDatabaseBlob(0, 0, *Ausgabe_Zeiger, Size)
DatabaseUpdate(0, "INSERT INTO bilder (bild) values ($1);")
Else
Debug DatabaseError()
EndIf
;######### Bild aus Db lesen #########
*Mem_Zeiger=ReAllocateMemory(*Ausgabe_Zeiger,Size)
If DatabaseQuery(0, "SELECT * FROM bilder")
FirstDatabaseRow(0)
Size=DatabaseColumnSize(0,0)
Debug "Bildgröße in der Db :" + Size
GetDatabaseBlob(0,0,*Ausgabe_Zeiger, Size)
FinishDatabaseQuery(0)
EndIf
DatabaseUpdate(0,"drop table bilder;")
CloseDatabase(0)
;######### Speicher Base64 dekodieren #########
*Mem_Zeiger=ReAllocateMemory(*Mem_Zeiger, Mem_Size)
Size_Neu = Base64Decoder(*Ausgabe_Zeiger, Size, *Mem_Zeiger, Mem_Size)
Debug "Größe nach dem dekodiern :" + Size_NeuCode: Alles auswählen
Speicherverbrauch mit Base64
Größe im Speicher : 51753
Größe Base64 kodiert : 69004
Bildgröße in der Db :69004
Größe nach dem dekodiern :51753Code: Alles auswählen
EnableExplicit
Define Mem_Size, bytes_gelesen, *Mem_Zeiger, Ausgabe_String.s, String_Size, Size_Neu
;######### Testbild in den Speicher laden #########
If ReadFile(0,"testbild.jpg")
Mem_Size=Lof(0)
*Mem_Zeiger=AllocateMemory(Mem_Size)
bytes_gelesen=ReadData(0,*Mem_Zeiger,Mem_Size)
Debug "Speicherverbrauch mit Base64"
Debug "Größe im Speicher : " + bytes_gelesen
Else
Debug "Bild konnte nicht geöffnet werden"
End
EndIf
CloseFile(0)
;######### Speicher >> String (Base64) #########
String_Size = Mem_Size * 1.35
Ausgabe_String.s=Space(String_Size)
Base64Encoder(*Mem_Zeiger,Mem_Size,@Ausgabe_String.s,String_Size)
Debug "Größe als Base64 kodierter String: " + MemoryStringLength(@Ausgabe_String.s,#PB_Ascii)
;######### String (Base64) in PostgreSQL Db schreiben #########
UsePostgreSQLDatabase()
If OpenDatabase(0, "host=localhost port=5432 dbname=postgres", "postgres", "***Paßwort****")
DatabaseUpdate(0,"create table bilder (bild text);")
DatabaseUpdate(0, "INSERT INTO bilder VALUES ('"+Ausgabe_String.s+"');")
Else
Debug DatabaseError()
EndIf
;######### String (Base64) aus Db lesen #########
*Mem_Zeiger=ReAllocateMemory(*Mem_Zeiger,Mem_Size)
If DatabaseQuery(0, "SELECT * FROM bilder")
FirstDatabaseRow(0)
Mem_Size=DatabaseColumnSize(0,0)
Debug "Bildgröße in der Db :" + Mem_Size
Ausgabe_String.s=GetDatabaseString(0,0)
FinishDatabaseQuery(0)
EndIf
DatabaseUpdate(0,"drop table bilder;")
CloseDatabase(0)
Debug "String wieder aus Db gelesen, noch Base64 kodiert : " + MemoryStringLength(@Ausgabe_String.s,#PB_Ascii)
;######### String in Speicher dekodieren #########
*Mem_Zeiger=ReAllocateMemory(*Mem_Zeiger, MemoryStringLength(@Ausgabe_String.s,#PB_Ascii))
Size_Neu = Base64Decoder(@Ausgabe_String.s, MemoryStringLength(@Ausgabe_String.s,#PB_Ascii), *Mem_Zeiger, MemoryStringLength(@Ausgabe_String.s,#PB_Ascii))
Debug "Größe nach dem dekodiern :" + Size_NeuCode: Alles auswählen
Speicherverbrauch mit Base64
Größe im Speicher : 51753
Größe als Base64 kodierter String: 69004
Bildgröße in der Db :69004
String wieder aus Db gelesen, noch Base64 kodiert : 69004
Größe nach dem dekodiern :51753Gruß, Micha122