AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Sockets und effektive on-the-fly Kompression
Thema durchsuchen
Ansicht
Themen-Optionen

Sockets und effektive on-the-fly Kompression

Ein Thema von Zacherl · begonnen am 29. Okt 2007 · letzter Beitrag vom 31. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Sockets und effektive on-the-fly Kompression

  Alt 29. Okt 2007, 18:19
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ß
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

Re: Sockets und effektive on-the-fly Kompression

  Alt 29. Okt 2007, 19:21
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
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Sockets und effektive on-the-fly Kompression

  Alt 29. Okt 2007, 21:23
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

Interessieren würde mich zudem ein Verfahren, welches auch parallel die Daten komprimiert und die bereits komprimierten Daten sendet.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Sockets und effektive on-the-fly Kompression

  Alt 29. Okt 2007, 21:27
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Sockets und effektive on-the-fly Kompression

  Alt 30. Okt 2007, 22:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#6

Re: Sockets und effektive on-the-fly Kompression

  Alt 30. Okt 2007, 22:13
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)
...
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Sockets und effektive on-the-fly Kompression

  Alt 30. Okt 2007, 22:27
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?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Sockets und effektive on-the-fly Kompression

  Alt 30. Okt 2007, 22:30
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 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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Sockets und effektive on-the-fly Kompression

  Alt 30. Okt 2007, 22:34
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: Sockets und effektive on-the-fly Kompression

  Alt 30. Okt 2007, 23:10
@alzaimar: War kein Meckern ..

Danke euch allen, werde es dann mal mit ZLibEx probieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 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