DBISAM veritabanında blob alanların zlib ile sıkıştırılması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
celalatak
Üye
Mesajlar: 70
Kayıt: 27 Şub 2004 12:41

DBISAM veritabanında blob alanların zlib ile sıkıştırılması

Mesaj gönderen celalatak »

Dbisam veritabanı kulanılan bir projeye sonradan dahil oldum. Yaklaşık 1 GB veri var. Veriler blob alanlarda tutuluyor ve bu alanlar zLib ile sıkıştırılmış. Bu alanlarda decompress yapmaya çalıştğımda hata veriyor.

Alanlar sıkıştırmak için kullanılan kod

Kod: Tümünü seç

procedure CompressStream(aInput,aOutput: TStream);
begin
  with TCompressionStream.Create(clMax, aOutput) do
    try
      CopyFrom(aInput,0);
    finally
      Free;
    end;
end;

Açmak için ise

Kod: Tümünü seç

procedure DecompressStream(aInput,aOutput: TStream);
const
  BUFFER_SIZE = 4096;
var
  aBuffer : array[0..BUFFER_SIZE-1] of byte;
  aCount  : Integer;
begin
  with TDecompressionStream.Create(aInput) do
    try
      repeat
        aCount := Read(aBuffer, BUFFER_SIZE);
        if aCount <> 0 then
           aOutput.WriteBuffer(aBuffer, aCount)
        else
           break;
      until False;
    finally
      Free;
    end;
end;
kullanılıyor.
Sıkıştırmada problem yok. Ancak açarken DBISAM 8711 <tablo adı> reached preamaturely hatası veriyor. Bu hata blob alanların uzunluğunun doğru verilmemesinden kaynaklanıyormuş.

Hatayı nasıl çözerim? Teşekkürler.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Burada sorun decompressionstream den değil de VT'den yaptığınız okumada gibi görünüyor.

BLOB alanı nasıl okuyorsunuz ve stream'e atıyorsunuz? Kodları gönderirseniz bir yorumda bulunabilirim.
celalatak
Üye
Mesajlar: 70
Kayıt: 27 Şub 2004 12:41

Mesaj gönderen celalatak »

Aşağıdaki kod ile DecompressStream gönderiyorum.

Kod: Tümünü seç

procedure TDataModule2.tabloAfterScroll(DataSet: TDataSet);
var
blb:tblobstream;
str:TStringStream;
begin
blb:=tblobstream(tablo.CreateBlobStream(tabloBlob_alan,bmRead));
try
  str := TStringStream.Create('');
  try
  blb.Position:=0;
  str.Position:=0;
  DecompressStream(blb,str);

  finally
    str.Free;
  end;

finally

blb.Free;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2385
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

sana tavsiyem afterscroll kullanma. sebebi mouse un wheel ını hareket ettirdiklerinde her geçen kayıt için çalışır, yani 5 satır a ayarlıysa 5 satır arka arkaya işlenmeye çalışılacaktır. Bir de cx gibi bir grid kullanıyorsan sakıncaları artabilir.
Bunun yerine forma bir dbedit koyup bunu prkey alanına bağla ve visible ını false yap. Bunun onChange eventında kodunu yaz. Çok basit ve ilkelce bir yöntem gibi görünsede sıfır hatayla çalışır :wink: ben hep bunu kullanırım.

Bir diğer önerimde, Stream leri döngü içinde yada senin yazdığın kod gibi çok sık tekrarlanabilecek durumlarda global tanımlayıp, mesela form show da create edip formclose da içini boşaltıp free lemeyi tercih edin. dbImage için blob dan resim okuyan bir component yapmıştım bundada mecburen stream kullandım. Hızlı scrollarda hata veriyordu, çözümü component ın create inde ve destroy unda stream leri create edip free lemekte bulmuştum.

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
celalatak
Üye
Mesajlar: 70
Kayıt: 27 Şub 2004 12:41

Mesaj gönderen celalatak »

Cevap için teşekürler ancak gönderdiğim kod deneme için yazılmıştı AfterScroll'ı program içinde kullanamıyorum.

zlib kullanmadığımda blob alanları açmada sorunum yok ama veritabanı sıkıştırılmış halde 1 GB yer kaplıyor bu kütüphaneyi kullanmak zorundayım.

Compress ederkende problem çıkmıyor. Ancak decompress yaparken 8711 nolu hatayı veriyor. DBISAM'sitesinde bu hatanın blob alanların uzunluğunun doğru verilmemesinden kayklandığını ve tablo repair yapılırsa sorunun çözüleceği yazıyor. Ancak çözülmedi.
Cevapla