Ram'ı dosya kopyalamada daha fazla kullanma?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mbt
Üye
Mesajlar: 165
Kayıt: 27 Şub 2004 01:23

Ram'ı dosya kopyalamada daha fazla kullanma?

Mesaj gönderen mbt »

Delphi'de dosya kopyalama fonksiyonu yazarken daha fazla ram kullanarak çok daha fazla hız kazandırabileceğim bir yol var mı ?

Blockread ve TStream sınıfının farklarını bilen var mı? Hangisi daha hızlı sizce? Veya başka seçenek...???
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Aralarında çok fark olmasa da TStream yeni nesil işletim sistemi fonksiyonları kullandığından tavsiye edilir ve bu nesnede bulunan CopyFrom metodu ile kopyalama işi çok pratik bir şekilde halledilebilir. Hedef.CopyFrom(Kaynak,Kaynak.Size); gibi.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

BlockRead ve TFileStream'in hızları noktasında her zaman birisi üstündür demek yanlış olur. Çünkü ikisi de ReadFile Windows API'sini kullanıyor. Ama TStream esnek olmasından dolayı tavsiye edilir. Ayrıca çok büyük dosyalarla çalışıyorsanız, ya da küçük ama sayısı fazla olan dosyalarla uğraşıyorsanız, kesinlikle TStream daha hızlıdır. Çünkü iki metod da ReadFile kullanıyor olmasına rağmen, ReadFile kullandığı buffer tekniği onu bu tarz bir işlemde yavaş kılar. Bunu aşmak için bir çok küçük buffer yerine tek ve bütün dosyaları içine alabilecek bir buffer kullanmak gereklidir. Bu işi de TStream yapıyor zaten. En hızlı yöntemi soruyorsan; VM(Virtual Memory) adres uzayına, win32 api çağrımları ile direk olarak dosyayı yerleştirmendir. Ama çok farkeder mi dersen bence çok fazla bir fark olmaz ve baya bir uğraştırabilir seni. En iyisi TFileStream :wink:
ikut

Re: Ram'ı dosya kopyalamada daha fazla kullanma?

Mesaj gönderen ikut »

mbt yazdı:Delphi'de dosya kopyalama fonksiyonu yazarken daha fazla ram kullanarak çok daha fazla hız kazandırabileceğim bir yol var mı ?

Blockread ve TStream sınıfının farklarını bilen var mı? Hangisi daha hızlı sizce? Veya başka seçenek...???
extended copy diye bir FAR plugini var. dosyaları hafıza ucucuca ekliyor (küçük dosyaları) ve paralel olarak yazıyor. dolayısı ile kopyalama hızı uçuk ötesi. kanynak kodunu ublup inceleyenilirsin.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Anladığım kadarıyla kendi verdiğin buffer boyutuna göre okuma yazma işlemi yapmak istiyorsun. O zaman bir SpinEdit nesnesinden aldığı değer kadar buffer boyu kullanalım:

Kod: Tümünü seç

var Buffer:TList;  Kaynak,Hedef:TStream; Okundu,BaslamaYeriValue:Int64;
begin
  Buffer:=TList.Create;
/////////////////
  Buffer.Capacity:=SpinEdit1.Value div SizeOf(Pointer);
/////////////////
  Kaynak:=TFileStreamStream.Create('c:\asıl.txt',fmShareDenyNone or fmOpenRead);
  Hedef:=TFileStreamStream.Create('c:\deneme.txt',fmCreate);
  repeat
    Okundu:=Kaynak.Read(Buffer.List^,Buffer.Capacity);
    if Okundu<=0 then Break;
    Hedef.Write(Buffer.List^,Okundu);
  until False;
  Kaynak.Free;
  Hedef.Free;
  Buffer.Free;
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla