Komprimieren mit IO.Compression.DeflateStream

27/11/2009 - 08:03 von Andreas Schädler | Report spam
Guten Morgen NG

Ich versuche mich mit dem Komprimieren und Dekomprimieren von Daten.

Eine ASCII-Datei wird per StreamRead eingelesen, komprimiert und in ein
DatenBankfeld vom Typ VarBinary abgelegt.
Spàter wird der Feldinhalt gelesen und mit
Data.SqlTypes.SqlBytes(meineRow.Feld).Stream der Dekomprimierung übergeben.

Mit einer ersten Testdatei mit für diese Anwendung typischem Inhalt wurden
die Daten nach dem Dekomprimieren 1:1 wieder ausgegeben.
Mit weiteren Dateien habe ich festgestellt, dass nach dem Dekomprimieren
einige Zeilen (z.B. 2 von 200'000) fehlen.
Habe nun zum weiteren Test eine Datei mit 17 Zeilen (8975 Byte) verwendet
und folgendes Verhalten festgestellt

Compress:
uncompressed mit einer Streamlànge von 8975 wird komprimiert wobei numRead
jeweils 4096, 4096, 783, 0 ist und retVal in den Schritten 954, 1538, 1722
wàchst.
Die Werte des buffers sind jeweils unterschiedlich.
Ich gehe davon aus, dass hier alles i.o ist

Decompress:
compressed hat eine Streamlànge von 1722. Mit decompressor.Read(buffer, 0,
buffer.Length) springt die StreamPosition von 0 auf 1722, numRead ist aber 0
und der buffer ist nur mit 0 Werten gefüllt.

Habe den Buffer mal auf 1023 gesetzt, das Verhalten ist gleich.

Wenn ich eine andere Datei mit einer Grösse von 34'208'192 anwende, wird sie
auf 3'972'042 komprimiert, und auch wieder lesbar dekomprimiert.

Kann mir jemand sagen, was ich hier falsch mache?

Vielen Dank und Gruss
Andreas

Private Shared Function Compress(ByVal uncompressed As IO.Stream) As
IO.Stream
Dim retVal As New IO.MemoryStream()
uncompressed.Position = 0
Dim compressor As New IO.Compression.DeflateStream(retVal,
IO.Compression.CompressionMode.Compress, True)
Dim buffer() As Byte = New Byte(4095) {}
Dim numRead As Integer = uncompressed.Read(buffer, 0, buffer.Length)
While numRead > 0
compressor.Write(buffer, 0, numRead)
numRead = uncompressed.Read(buffer, 0, buffer.Length)
End While
retVal.Position = 0

Return retVal
End Function

Private Shared Function Decompress(ByVal compressed As IO.Stream) As
IO.Stream
Dim retVal As New IO.MemoryStream
compressed.Position = 0
Dim decompressor As New IO.Compression.DeflateStream(compressed,
IO.Compression.CompressionMode.Decompress, True)
Dim buffer() As Byte = New Byte(4095) {}
Dim numRead As Integer = decompressor.Read(buffer, 0, buffer.Length)
While numRead > 0
retVal.Write(buffer, 0, numRead)
numRead = decompressor.Read(buffer, 0, buffer.Length)
End While
retVal.Position = 0

Return retVal
End Function
 

Lesen sie die antworten

#1 Elmar Boye
27/11/2009 - 14:56 | Warnen spam
Hallo Andreas,

"Andreas Schàdler" schrieb ...
Ich versuche mich mit dem Komprimieren und Dekomprimieren von Daten.

Mit einer ersten Testdatei mit für diese Anwendung typischem Inhalt wurden
die Daten nach dem Dekomprimieren 1:1 wieder ausgegeben.
Mit weiteren Dateien habe ich festgestellt, dass nach dem Dekomprimieren
einige Zeilen (z.B. 2 von 200'000) fehlen.

Kann mir jemand sagen, was ich hier falsch mache?



Du mußt dn DeflateStream am Ende via Close schliessen bzw. via Dispose
freigeben - letzteres am besten via using -, damit die letzten Daten im Puffer gepackt
und geschreiben werden.

Gruß Elmar

Ähnliche fragen