Zeos zum bearbeiten einer JET und einer SQLite - Datenbank

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von af0815 »

Es werden nur immer soviel aus der DB gelesen wie notwendig ist, deshalb kann es bei RecCount und RecNo zu Ergebnissen kommen die man nicht erwartet. Bei DesktopDBs wo man mit ZTable und nicht mit Queries arbeitet sind die Ergebnisse richtig, bei ServerDBs sollte man sie nicht verwenden. Zu Access ist es schwer zu sagen, die ist weder ´DesktopDB noch ServerDB, und vor allen kist es ja auch stark Treiberabhängig. Hier hilft oft als Test, wenn man auf den letzten Datensatz springt, dann erst die Felder ausliest.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

wp_xyz hat geschrieben:ZQuery1.RecordCount


Wunderbar ! Funktioniert !

Herzlichen Dank,.
-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

af0815 hat geschrieben:Es werden nur immer soviel aus der DB gelesen wie notwendig ist,

Yep. das ist klar. Wenn man die tatsächliche Anzahl der "passenden" Sätze wissen will, muss man vermutlich "seelct count" machen. Ich zeige den Wert aber momentan nur an und tue programmatisch nichts damit. Also nur ein Schönheits-Problem. (Selbst wenn ich spaßeshalber damit noch einen Fortschritts-Balken einbaue.)

Frage ist nur, was "Notwendig" - oder sinnvoll - bedeutet. Es könnte z.B. von der Größe des freien RAM-Speichers abhängen.

In diesem Beispiel wurden 10000 Sätze anscheinend "am Stück" eingelesen.

(Übrigens: Um möglichst wenig RAM für den result-Set zu verbrauchen habe ich statt "select *" nur die tatsächlich benötigten Felder angegeben, und dabei die Erkenntnis gewonnen, dass man (natürlich) das Index-Feld mit holen muss, auch wenn man es nicht explizit braucht, weil sonst das Update auf den Satz hundert mal so lange dauert :) )

-Michael (Ich schicke Dir heute Abend mal das Programm per Mail)

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von Michl »

Man kann auf unterschiedliche Weise abfragen, wieviel Datensätze in der Datenbanktabelle enthalten sind. Wenn ich mich richtig erinnere, ist dies ein Beispiel vom Vorteil von Zeos gegenüber SQLDB. Bei Zeos werden bei Query.RecordCount die tatsächlich in der Datenbank enthaltenen Datensätze zurückgegeben, bei SQLDB nur die schon geladenen (wobei man deren Menge über Query.PacketRecords steuern kann). Ist wohl auch der Grund, warum bei einem DBGrid der Scrollbalken bei Zeos beim ersten Start schon korrekt ist und bei SQLDB beim Scrollen angepasst wird.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

Ich meine mich zu erinnern, irgendwo gelesen zu haben, dass Zeos immer das gesamte Result-Set läd. Keine Ahnung, was passiert, wenn der sehr groß ist.

-Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von af0815 »

mschnell hat geschrieben:Ich meine mich zu erinnern, irgendwo gelesen zu haben, dass Zeos immer das gesamte Result-Set läd. Keine Ahnung, was passiert, wenn der sehr groß ist.

-Michael

Was ich aus meinen Analysen am Server sehe (M$ Sql), wird immer nur vom Resultset übertragen, was gerade benötigt wird. Kann sein, das es für Desktopdatenbanken anders ist.

Andreas

PS: Danke für die Sourcen, wäre schön, wenn man die offenlegen könnte. Die Art wie du die Kompression bestimmt, ist echt steil. Die Idee alleine ist Wert, publiziert zu werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

af0815 hat geschrieben:wäre schön, wenn man die offenlegen könnte.

Kein Problem, falls sich jemand dafür interessiert.
af0815 hat geschrieben:. Die Art wie du die Kompression bestimmt, ist echt steil. Die Idee alleine ist Wert, publiziert zu werden.

Wenn es denn ordentlich funktionieren würde....

Ist aber nur ein grober Schätzwert.

Idiotischer Weise scheint die "Quality" Property der JPEG Komponente zur Abfrage eines geladenen Bildes nicht zu funktionieren. Da kommt immer 75, wenn man die Quality nicht vorher von Hand gesetzt hat.

Ich habe noch vor, ein paar Kompressionsfaktoren mit mehreren Bildern zu probieren und die Parameter einer lineare Funktion sauber zu bestimmen das sollte dan für diesen Anwendungsfall reichen :) .

-Michael

Benutzeravatar
theo
Beiträge: 10462
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von theo »

Sorry, aber ich finde es irgendwie nicht gut, wenn ihr die Hälfte privat besprecht.
Entweder privat oder öffentlich, aber dieser Mix hier ist nicht so toll.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

Nix besprochen, nur die Datei per Mail geschickt (weil die vermutlich sonst niemanden interessiert).

-Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von af0815 »

Das angesprochene, was ich so interessant finde:

Bei jpeg, weis man ja vorher nicht wir groß das Bild bei einer Kompressionsstufe wird. Vor allen, wenn man den Speicherplatz optimieren will und das der treibende Faktor ist. Hier in einer Schleife einfach das Bild komprimieren und dabei hinter messen ob die gewünschte Größe schon erreicht ist. Und das ganze ohne fremde Komponenten.

Ich weis das klingt simpel, aber oft sind so simple Sachen so genial, das man meistens viel zu kompliziert denkt und solche einfachen Lösungen ganz einfach übersieht.

Aber vielleicht hat Theo ein einfachere Lösung für die Optimierung von jpeg auf Speicherplatz für Thumbnails.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

Die implementierte Methodik funktioniert so:

- Die maximale Speicherplatz für die Bild-Information (BLOB in der Datenbank) ist vorgegeben
- Es werden mit einem entsprechenden "selecrt" nur die Datensätze gefunden, die eine größer Bild-Information besitzen.
- Der Byte-Stream mit der JPEG Informtion wird aus dem, Result-Set entnommen und in einem Canvas decodiert
- Der vermutlich sinnvolle JPEG-Kompressionsgrad wird nach einer linearen Funktion aus der Pixel-Anzahl geschätzt
- Aus dem Canvas wird mit dem geschätzten Kompressionsgrad ein neuer Stream, mit einer JPEG Informtion erzeugt
- Ist der Stream zu groß, wird der Kompressionsgrad solange halbiert (vermutlich wäre Faktor 2/3 besser) bis er passt.
- Das Ergebnis wird in den Datemnsatz zurückgeschrieben.

Die Parameter der besagten linearen Funktion sind momentan grob geschätzt. ich werde da noch ein Statistik (Ausgleichsrechnung) machen um sie sinnvoller zu bestimmen.

-Michaekl

Benutzeravatar
theo
Beiträge: 10462
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von theo »

af0815 hat geschrieben:Aber vielleicht hat Theo ein einfachere Lösung für die Optimierung von jpeg auf Speicherplatz für Thumbnails.


Nicht direkt. Das liegt aber auch daran, dass ihr privat besprochen habt, was hier alles warum vorgegeben ist.

Wenn ich frei wäre, würde ich es überhaupt nicht so machen. Ich würde noch nicht mal die Binärdaten (Bilder) überhaupt in eine Datenbank legen.
Was haben Binärdaten in einer DB zu suchen? Kann ich danach filtern, sortieren, suchen? Nein.
Bei mir liegen die immer im Filesystem und nur die Filenamen kommen in die DB. Damit erübrigt sich auch die fixe BLOB Größe.
Aber gut, das ist wohl eine "philosophische" Frage. Das kommt vllt. daher, dass ich so etwas meistens für's Web programmiere und es dort besonders wenig sinnvoll ist.

Bezüglich JPEG kann ich nur auf den Patch hinweisen, den ich damals für meinen Thumbviewer in den FPC Code einfließen ließ.
Damit kann man die Berechnung wenigstens beschleunigen, damit es nicht ganz so rechenintensiv wird:
http://svn.freepascal.org/cgi-bin/viewv ... 3&r2=15855

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

Wie bereits erwähnt, habe ich das Format der Datenbank nicht in der Hand. Die wird von einem existierenden Programm bearbeitet. Nur die Inhalte können veerändert werden.

Ist der Patch nicht in die Standard-Version von der library eingeflossen ?

-Michael

Benutzeravatar
theo
Beiträge: 10462
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von theo »

mschnell hat geschrieben:Ist der Patch nicht in die Standard-Version von der library eingeflossen ?

Doch,das ist ja auch das Diff der "Standard-Version".

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeos zum bearbeiten einer JET und einer SQLite - Datenba

Beitrag von mschnell »

mschnell hat geschrieben:Ist aber nur ein grober Schätzwert.

Ich habe noch vor, ein paar Kompressionsfaktoren mit mehreren Bildern zu probieren und die Parameter einer lineare Funktion sauber zu bestimmen das sollte dan für diesen Anwendungsfall reichen :)


Update: Zum Schätzen benutze ich jetzt die Formel

KompressionsGrad = ((IstGroesse - 850) * 160 ) / Pixel_Anzahl (in Prozent, funktioniert gut für Kompressionsgrad um die 10 %)

-Michael

Antworten