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...???
Ram'ı dosya kopyalamada daha fazla kullanma?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- fatihtolgaata
- Üye
- Mesajlar: 382
- Kayıt: 04 Mar 2004 09:46
- Konum: K.çekmece / İstanbul
- İletişim:
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 

Re: Ram'ı dosya kopyalamada daha fazla kullanma?
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.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...???
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .