AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Daten komprimieren bis eine bestimmte Größe erreicht wird
Thema durchsuchen
Ansicht
Themen-Optionen

Daten komprimieren bis eine bestimmte Größe erreicht wird

Ein Thema von littleDave · begonnen am 20. Mär 2008 · letzter Beitrag vom 20. Mär 2008
Antwort Antwort
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#1

Daten komprimieren bis eine bestimmte Größe erreicht wird

  Alt 20. Mär 2008, 15:28
Hallöchen erstmal,

Ich möchte in meinen Netzwerk-Protokoll eine optionale Kompression der Daten beim Senden von Dateien einbauen. Dabei habe ich folgendes Problem:

Also komprimieren funktioniert schon wunderbar, will es aber verbessern:
Ich habe eine feste Daten-Nutzgröße von 1350 Bytes. Diese möchte ich so voll wie möglich kriegen um das Netzwerk möglichst auslasten zu können. Wenn ich jetzt die Kompression einschalte, wird folgende Funktion vor dem Senden bzw nach dem Empfang ausgeführt (benutze zLibEx122):

Delphi-Quellcode:
function FileMode_CompressData(var Data; Size: word; Compress: boolean): word;
// Data: die eigentlichen Daten
// Size: die Größe von Data
// Compress: wenn TRUE, sollen die Daten komprimiert werden, ansonsten sollen sie dekomprimiert werden
var
  OutData: Pointer;
  OutSize: integer;
begin
  try
    if Compress then
    begin
      ZCompress(@Data, Size, OutData, OutSize, zcMax);
      // nur wenn die Größe der Komprimierten Daten kleiner ist,
      // sollen die komprimierten auch benutzt werden
      if OutSize < Size then
         CopyMemory(@Data, OutData, OutSize);
      result := OutSize; // neue Größe von Data zurückgeben
    end else
    begin
      ZDecompress(@Data, Size, OutData, OutSize);
      CopyMemory(@Data, OutData, OutSize);
      result := OutSize;
    end;
  finally
    if OutData <> nil then
       FreeMem(OutData);
  end;
end;
Jetzt kann es sein, dass Data nicht mehr 1350 Byte groß ist, sondern z.B. nur noch 816 Byte. Dadurch wird meine Paketgröße von 1350 aber nicht voll ausgenutzt. Was ich jetzt suche, wäre eine Funktion, die folgendes macht

Delphi-Quellcode:
Comp := TCompressionStream.Create(ms, zcMax);
while ms.Size < 1350 do // <<<<----- !!!! DAS FEHLT MIR - DIE AKTUELLE, UND ZWAR DIE WIRKLICH AKTUELLE GRÖßE VON ms
  Comp.Write(c, 1); // ein weiteres Byte einfügen
Ich kann die Funktion so bereits benutzen, doch da zLib intern mit einem Puffer von 65535 Byte arbeitet, hat ms nach dem Beenden der Schleife immer eine Größe von 65535 Bytes, was wohl etwas zu groß ist.

Ich weiß nicht ob es rein Theoretisch möglich ist, nur die ersten 1350 bytes des Streams dann zu benutzen, doch die Rechenzeit für die übrigen 64185 Bytes benötigt wird, die immer für die Katz wären, sind mir einfach zu Schade

Falls jemand eine Idee hat, wie ich das Problem lösen könnte, wäre es sehr supi, wenn er mir das zeigen könnte
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Daten komprimieren bis eine bestimmte Größe erreicht wir

  Alt 20. Mär 2008, 15:37
hmm, ich versteh nicht ganz das problem. was spricht dagegen erst die daten komplet zu comprimieren und dann die fertig komprimierten daten stückenweise zu senden?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#3

Re: Daten komprimieren bis eine bestimmte Größe erreicht wir

  Alt 20. Mär 2008, 15:52
Das mit den komprimierten Daten stückchenweise schicken hätt ich ja schon längst gemacht, nur das Problem ist was anderes:
Das Protokoll unterstützt den Download von mehreren Quellen, also von mehreren Servern. Eine Datei wird in dazu zuerst in mehrere Parts unterteilt. Jetzt wird vom Clienten eine Anfrage der Daten des Parts X gesendet. Der Server antwortet dann mit den Nutzdaten (und den Protokoll-Headern natürlich). Es kann aber sein, dass Server 1, der Part X senden soll, Part X+1 noch nicht fertig hat (p2p ala BitTorrent). Wenn ich jetzt Part X anfordere, würde Part X+1 mitgesendet, aber Part X+1 ist ungültig, worurch später Part X+1 nochmal heruntergeladen werden müsste.
Wenn der Client bereits Part X+1 heruntergeladen hat, würde dieser somit nochmal heruntergeladen, was auch schwachsinnig wäre. Somit darf der Server nur genau Part X senden, nicht mehr!
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:24 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