Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Dosya sıkıştırma (ZLIB ile)
#1
Selam, dosya sıkıştırma ile alakalı işi bilen arkadaşlara danışmak istiyorum.
Ben şu anda aşağıdaki şekilde kullanıyorum, fakat öğrenmek istediğim bunun daha hızlı bir yolu varmıdır?
uses zlib;

procedure CompressStream(inpStream, outStream: TStream);
var
 InpBuf, OutBuf: Pointer;
 InpBytes, OutBytes: Integer;
begin
 InpBuf := nil;
 OutBuf := nil;
 try
   GetMem(InpBuf, inpStream.Size);
   inpStream.Position := 0;
   InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
   CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
   outStream.Write(OutBuf^, OutBytes);
 finally
   if InpBuf <> nil then FreeMem(InpBuf);
   if OutBuf <> nil then FreeMem(OutBuf);
 end;
end;

procedure DecompressStream(inpStream, outStream: TStream);
var
 InpBuf, OutBuf: Pointer;
 OutBytes, sz: Integer;
begin
 InpBuf := nil;
 OutBuf := nil;
 sz     := inpStream.Size - inpStream.Position;
 if sz > 0 then
   try
     GetMem(InpBuf, sz);
     inpStream.Read(InpBuf^, sz);
     DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
     outStream.Write(OutBuf^, OutBytes);
   finally
     if InpBuf <> nil then FreeMem(InpBuf);
     if OutBuf <> nil then FreeMem(OutBuf);
   end;
 outStream.Position := 0;
end;

//Kullanımı
var
eski, yeni : TMemoryStream;
begin
 eski := TMemoryStream.Create;
 eski.LoadFromFile('c:\yedeklenecek.dosya');
 yeni := TMemoryStream.Create;
 CompressStream(eski,yeni);
 yeni.SaveToFile('xxx.ydk');
 eski.Free;
 yeni.Free;
end
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#2
Hız mı önemli boyut mu?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#3
Hız önemli boyut işi sona kalıyor şu anda.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#4
Aşağıda yine ZLIB ile sıkıştırma mevcut. clmax değerini değiştirerek sıkıştırma seviyesi ile oynayabilirsin. Fast veya default yaparsan hız kazanacaksın ancak sıkıştırma oranı düşecek. None ise sıkıştırmadan depoluyor. (clNone, clFastest, clDefault, ve clMax.)

Function CompressFile(FileName,CompressedFileName:String): Byte;
Var
 InFile,OutFile:TFileStream;
 Comp:TCompressionStream;
Begin
 Try
   InFile:=TFileStream.Create(FileName,fmOpenRead);
 Except
   Result:=01;
   Exit;
 End;
 Try
   OutFile:=TFileStream.Create(CompressedFileName, fmCreate);
 Except
   Result:=02;
   InFile.Free;
   Exit;
 End;
 Try
   Comp:=TCompressionStream.Create(clMax,OutFile);
 Except
   Result:=03;
   InFile.Free; 
   OutFile.Free;
   Exit;
 End;
 Result:=00;
 Try
   Comp.CopyFrom(InFile,0);
 Except
   Result:=04;
 End;
 Comp.Free;
 InFile.Free;
 OutFile.Free;
End;

Function DecompressFile(FileName,DeCompressedFileName:String):Byte;
Var
 InFile,OutFile:TFileStream;
 DeComp:TDeCompressionStream;
 Buffer:Array[0..4095] Of Byte;
 Count:Integer;
Begin
 Try
   InFile:=TFileStream.Create(FileName,fmOpenRead);
 Except
   Result:=01;
   Exit;
 End;
 Try
   OutFile:=TFileStream.Create(DeCompressedFileName,fmCreate);
 Except
   Result:=02;
   InFile.Free;
   Exit;
 End;
 Try
   DeComp:=TDeCompressionStream.Create(InFile);
 Except
   Result:=03;
   InFile.Free;
   OutFile.Free;
   Exit;
 End;
 Result:=00; 
 Repeat
   Try
     Count:= DeComp.Read(Buffer,SizeOf(Buffer));
     If Count<> 0 Then OutFile.WriteBuffer(Buffer,
   Count);
   Except
     Result:=04;
     Count:=0;
   End;
 Until Count=0;
 DeComp.Free;
 InFile.Free;
 OutFile.Free;
End;
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#5
@engerex cevap için teşekkürler fakat sizin kodu akşam deneyebilicem, yalnız kodda 4096 byte lık bloklar haline yazıyor, benim yazdığım koddan yavaş çalışacağını düşünüyorum ama denicez yinede
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#6
Hız problemi yaşadınız mı?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#7
test etme imkanım henüz olmadı @engerex bu akşam çalışmazsam bakabilicem, deneyince sonucu buraya yazıcam bakalım.

Hazır aklıma gelmişken bi deniyeyim dedim Smile hemen hemen hiçbi fark yok aralarında, 292 BM tek dosya üzerinde hızlıca bi deneme yaptım 150-200 ms fark çıkıyor arada, bazen sizin kod iyi çıkıyor bazen benim yazdığım kod. Bi fark yok yani, bence aralarında.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#8
@engerex peki sıkıştırdığımız arşive şifre ekleyebilir miyiz ?
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#9
@yhackup ZLIBin böyle bir desteği yok ama ikinci bir işlem ile elbette şifreleyebilirsin. Eğer çok basit bir şifreleme yeter dersen dosyanın her baytına bir değer ekle [1..254]  Daha güçlü şifreleme istersen AES gibi bu işe özel standartlar var.

@esistem O farkta birinin üstün olduğundan değil. Sadece birini denesen aynı fark yine çıkar. Zaten 4096 byte buffer sıkıştırmada değil çözmede kullanılıyor. Çözme ise çok daha hızlı gerçekleşiyor.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#10
(26-09-2016, Saat: 18:27)engerex Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@yhackup ZLIBin böyle bir desteği yok ama ikinci bir işlem ile elbette şifreleyebilirsin. Eğer çok basit bir şifreleme yeter dersen dosyanın her baytına bir değer ekle [1..254]  Daha güçlü şifreleme istersen AES gibi bu işe özel standartlar var.

@esistem O farkta birinin üstün olduğundan değil. Sadece birini denesen aynı fark yine çıkar. Zaten 4096 byte buffer sıkıştırmada değil çözmede kullanılıyor. Çözme ise çok daha hızlı gerçekleşiyor.

çözmeyi deneyemedim maalesef, vaktim olmadı Sad akşam bakarım ona
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  ZLib ve Webservis narkotik 0 92 29-07-2019, Saat: 16:16
Son Yorum: narkotik
  [ÇÖZÜLDÜ] WebDav ile Bulut Sunucuya Dosya Yükleme theSinan 4 436 08-07-2019, Saat: 15:42
Son Yorum: r3n4m3
  Dosya Adı ve İçeriğinde Arama Yapma dkadir 3 319 23-06-2019, Saat: 06:53
Son Yorum: dkadir
  Bilgisayar ile android arasında dosya aktarımı erkutolga 3 283 28-05-2019, Saat: 18:44
Son Yorum: erkutolga
  Dosya adresi Yeliz 2 358 02-03-2019, Saat: 16:13
Son Yorum: Yeliz



Konuyu Okuyanlar: 1 Ziyaretçi