Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Sockets und effektive on-the-fly Kompression (https://www.delphipraxis.net/102474-sockets-und-effektive-fly-kompression.html)

Zacherl 29. Okt 2007 17:19


Sockets und effektive on-the-fly Kompression
 
Hey,

ich habe mal eine Frage bezüglich der sogenannten on-the-fly Kompression. Und zwar: Kennt jemand einen Komprimierungs-Algorithmus, der dies effektiv unterstüzt? Meine halt nicht sowas wie ZIP, was bei Datenmengen bis maximal 4KiB ja nicht sehr effektiv ist.

Dann die zweite Frage dazu: Gibt es irgendwo ein Beispiel welches das Ganze anhand der Sockets demonstriert. Naja fürs Empfangen ist das ja kein Problem, da die Pakete sowieso durch ein eigenes Protkoll richtig zusammengesetzt werden müssen. Dann kann ich die entreffenden Datenpakete auch gleich dekomprimieren.

Fürs Senden hätte ich jetzt aber keine Idee, wie ich die Datei sequenziell komprimieren und schicken kann, ohne gleich ein eigenes Buffering vorzunehmen, sprich: Die Daten in kleine z.b. 2KiB große Pakete einzuteilen. Diese Arbeit machen die Sockets denke ich schon recht zuverlässig ..

Gruß

BUG 29. Okt 2007 18:21

Re: Sockets und effektive on-the-fly Kompression
 
Hi Zacher,

mit einer LZ77-Koprimierung oder ähnlichen kannst du sogar schon anfangen zu dekomprimieren, wenn die Daten nur zum Teil eingetroffen sind.

MfG,
Bug

Zacherl 29. Okt 2007 20:23

Re: Sockets und effektive on-the-fly Kompression
 
Ist dies der einzige Algorithmus bei dem sowas geht? Weil laut Wikipedia Beschreibung ist er ja weder in der Kompressionsrate noch in der Geschwindigkeit so toll :D

Interessieren würde mich zudem ein Verfahren, welches auch parallel die Daten komprimiert und die bereits komprimierten Daten sendet.

alzaimar 29. Okt 2007 20:27

Re: Sockets und effektive on-the-fly Kompression
 
Ich hab zlibEx für meine Socketübertragung verwendet. Der ist schnell und sehr effektiv. die Übertragungsrate stieg um ca. 40-50% gegenüber der unkomprimierten Übertragung.

Zacherl 30. Okt 2007 21:09

Re: Sockets und effektive on-the-fly Kompression
 
Mit ZLib kann man aber doch keine progressive De/Compression durchführen. Das Problem ist, dass sehr viel Zeit drauf geht, wenn man beispielsweise eine 500MiB Datei übertragen will.
Daher soll die Kompression und die Übertragung, bzw Dekompression überlappend stattfinden.

gsh 30. Okt 2007 21:13

Re: Sockets und effektive on-the-fly Kompression
 
Zitat:

Zitat von Zacherl
Mit ZLib kann man aber doch keine progressive De/Compression durchführen. Das Problem ist, dass sehr viel Zeit drauf geht, wenn man beispielsweise eine 500MiB Datei übertragen will.
Daher soll die Kompression und die Übertragung, bzw Dekompression überlappend stattfinden.

ja aber du könntest es ja so machen:

ersten 20KB der datei nehmen
diese 20kb packen
übertragen
empfänger entpackt (während das nächste 20KB packet kommt)
...

Zacherl 30. Okt 2007 21:27

Re: Sockets und effektive on-the-fly Kompression
 
Das stimmt wohl, aber so wie ich die ZLib Kompression verstehe wird diese desto effektiver, je mehr Daten auf einmal komprimiert werden =/

Kann man denn wenigstens die Buffergröße der Sockets auslesen, damit ich die Pakete daran anpassen kann?

alzaimar 30. Okt 2007 21:30

Re: Sockets und effektive on-the-fly Kompression
 
Zitat:

Zitat von Zacherl
Mit ZLib kann man aber doch keine progressive De/Compression durchführen. Das Problem ist, dass sehr viel Zeit drauf geht, wenn man beispielsweise eine 500MiB Datei übertragen will.

Erst testen, dann meckern.
Meine Übertragunsrate (vom Client aus gesehen die Zeit zwischen Anforderung und letztem empfangenen Byte) um 40% (von 6MB/sek auf 10MB/sek) und mir reicht das. Ich habe mit wesentlich schnelleren Kompressionsalgorithmen experimentiert, aber zLib hat das beste 'Geschwindigkeit/Kompressionsrate'-Verhältnis. ZLib basiert (glaube ich) auf LZW, und das ist schon recht flott.

Eine 500MB Datei würde also z.B. unkomprimiert ca. 100 Sekunden benötigen. Inklusive Kompression ist sie aber in ca. 60 Sekunden empfangen. Ok, nicht berauschend, aber ausreichend, oder?
Zitat:

Zitat von Zacherl
Daher soll die Kompression und die Übertragung, bzw Dekompression überlappend stattfinden.

Ich kann mir vorstellen, das man mit ZLib eine 'progressive' (falsches Wort: überlappend/overlapped wäre besser) Kompression/Dekompression hinbekommt. Der Kompressionsalgorithmus ist straightforward, also könnte man den Output sofort in den TCP-Stream packen. Ebenso auf der Dekompressionsseite. Der einfachste Ansatz wäre der, die 32KB Blöcke, die man in ZCompressStream verwendet, direkt zu verschicken...

Stimmt, ist eigentlich eine gute Idee. Vermutlich würde die Datenrate noch weiter steigen...

sirius 30. Okt 2007 21:34

Re: Sockets und effektive on-the-fly Kompression
 
Zitat:

Kann man denn wenigstens die Buffergröße der Sockets auslesen, damit ich die Pakete daran anpassen kann?
Wenn es dir hilft:

Die WinAPI kennt getSockOpt (Unit WinSock)
Delphi-Quellcode:
len:=4;
getsockopt(aSocket,     //Socket-Handle
           SOL_SOCKET,
           SO_SNDBUF,   //bzw. eben SORCVBUF
           @I_optvalue, //Buffer: hier integer fürs Ergebnis
           len);        //länge des Buffers

Zacherl 30. Okt 2007 22:10

Re: Sockets und effektive on-the-fly Kompression
 
@alzaimar: War kein Meckern ..

Danke euch allen, werde es dann mal mit ZLibEx probieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.
Seite 1 von 2  1 2      

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