Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
21-09-2016, Saat: 17:33
(Son Düzenleme: 21-09-2016, Saat: 17:39, Düzenleyen: esistem.
Sebep: değişken değiştirme
)
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
Yorumları: 970
Konuları: 44
Kayıt Tarihi: 24-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.712 Uzman
Hız mı önemli boyut mu?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
Hız önemli boyut işi sona kalıyor şu anda.
Yorumları: 970
Konuları: 44
Kayıt Tarihi: 24-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.712 Uzman
21-09-2016, Saat: 22:40
(Son Düzenleme: 21-09-2016, Saat: 22:41, Düzenleyen: engerex.)
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...
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
@ 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
Yorumları: 970
Konuları: 44
Kayıt Tarihi: 24-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.712 Uzman
Hız problemi yaşadınız mı?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
26-09-2016, Saat: 16:12
(Son Düzenleme: 26-09-2016, Saat: 16:26, Düzenleyen: esistem.)
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 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.
Yorumları: 2.017
Konuları: 246
Kayıt Tarihi: 09-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 4.370 Uzman
@ engerex peki sıkıştırdığımız arşive şifre ekleyebilir miyiz ?
Yorumları: 970
Konuları: 44
Kayıt Tarihi: 24-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.712 Uzman
@ 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...
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
(26-09-2016, Saat: 18:27)engerex Adlı Kullanıcıdan Alıntı: @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ı akşam bakarım ona
|