250 MB text dosyası nasıl işlenir

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
emrekush
Üye
Mesajlar: 31
Kayıt: 01 Mar 2004 02:48

250 MB text dosyası nasıl işlenir

Mesaj gönderen emrekush »

250 mb text dosyayı stringlist ile satır satır sorgulamak istiyorum. veri tabanı kullanmak istemiyorum.
memory yetersizligi nedeniyle de hepsini hafızaya alamıyorum.
acaba stringlist'e kısmi yükleme yapma imkanı varmı? mesela sorgulamak icin text dosyanın önce 1000 satırını stringlist'e alayım sonra 2000 den başlayarak 1000 satırı yükleyeyim. nasıl yaparım bunu? fikir verebilecek olan var mı? veri tabanı programları çok büyük dosyaları nasıl sorguluyor. mantığı nedir bunun?
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Dosyayı bir tmemorystream içine istediğin kadar okut. Daha sonra tstringlist in loadfromstream methodu ile stream den stringlist e verileri aktar.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

viewtopic.php?p=30679#30679
büyük string parçaların içinde hızlı arama yapma ve değiştirme algoritmasıyış. denemedim ama verdiği örnekteki karşılaştırma inanılmaz.
10 mbyte lık dosyayı
StringReplace 8 saatte tamamlarken
FastReplace fonksiyonu yarım saniyede tamamlıyormuş. Shocked
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Veri tabanları binary çalışıyorlar ve fazla! gelişmiş File Hashing fonksiyonları kullanıyorlar. Bu sistemde temel mantık, aradığın verinin dosyadaki offsetini önceden hesaplama üzerine kurulu. Hesaplama işlemi dosyadan okuyup karşılaştırma üzerine kurulu olmadığı için veriye çok daha hızlı erişiyor.

Sanırım senin durumunda en mantıklısı coderlord ve mege'nin yazdıklarını birleştirmek. Kendine bir BufferSize belirle (örneğin 10MB), dosyadan 10 MB oku, gerekli işlemleri yap. Sonra satır sonunu da dikkate alarak, kaynak dosyadan 10 MB daha oku.

Kolay gelsin,
Bahadır Alkaç
emrekush
Üye
Mesajlar: 31
Kayıt: 01 Mar 2004 02:48

kısmi yüklemeyi beceremedim, yapabildiğim :

Mesaj gönderen emrekush »

cevap veren arkadaşlara çok teşekkür ederim.


var
M:TMemoryStream;
list:Tstringlist;
start,finish,d:Integer;
begin
list:=Tstringlist.create;
try
M := TMemoryStream.create;
M.LoadFromFile('C:\dosya.txt');
list.LoadFromStream(M);
start := pos('1 ',list.text);
finish := pos('1000',list.text);
RichEdit1.lines.Text := copy(list.text,start,(finish-start));
finally
M.Free;
list.free;
end;
end;


bu fonksiyon çalışıyor. ancak 250 mb dosyayı hafızaya alıyor ki 30 saniye kadar zaman geçiyor. halbuki aynı işlemi 10 MB dosyada denediğimde 1-2 saniyede sonuç geliyor.

kısmi yüklemeyi yani dosyanın 0. byte'ıntan 10 MB'a kadar olan kısmını nasıl alabilirim. elinizde kücük bir örnek var mı?
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Yok LoadFromFile hepsini yükler.

TFilestream ile aç. Ama loadfromfile kullanma.

ReadBuffer ile dilediğin byte kadaroku. Buffer olarak memorystream'in buffer'ını ver. Burayı depo olarak kullan.

stringlist.loadfromstream ile memorystream den yükle
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

var
f: Textfile;
S: string;
begin
AssignFile(f,'c:\dosya.txt');
Reset(f);
while not Eof(f) do
begin
Readln(f,s);
ShowMessage(s);
end;
CloseFile(f);

bu tarz denedin mi ?
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

merak ettimde ne kadar sürede yapabilir diye :) gerçekten dendiği kadar hızlı. 350 mb ı ~35 mb lık bloklar halinde açıp yaprsanız 10 saniyeden kısa sürer bu işlem.
dosya yükleniyor : 22:54:38
dosya satır sayısı : 753665
dosya byte : 33554413
======================
arama-değiştirme başlıyor : 22:54:39
arama-değiştirme bitti : 22:54:40 :mrgreen:
======================
kaydetme başlıyor : 22:54:40
kaydetme bitti : 22:54:43
not : herhalde kaydetmenin uzun sürmesi benim hdd nin hantallığındandır.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,faststrings, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    TestEkrani: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyList:TstringList;
begin
  MyList :=TStringList.Create;
  try
     // yükleme
     TestEkrani.Lines.Clear;
     TestEkrani.Lines.add('dosya yükleniyor : '+timetostr(now));
     MyList.loadfromfile('a.txt');
     TestEkrani.Lines.add('dosya satır sayısı : '+inttostr(mylist.Count));
     TestEkrani.Lines.add('dosya byte : '+inttostr(length(mylist.text)));     
     TestEkrani.Lines.add('======================');
     // arama
     TestEkrani.Lines.add('arama-değiştirme başlıyor : '+timetostr(now));
     mylist.Text := FastReplace(mylist.Text,'a','xxxx',false);
     TestEkrani.Lines.add('arama-değiştirme bitti : '+timetostr(now));
     TestEkrani.Lines.add('======================');
     // kaydetme
     TestEkrani.Lines.add('kaydetme başlıyor : '+timetostr(now));
     MyList.SaveToFile('b.txt');
     TestEkrani.Lines.add('kaydetme bitti : '+timetostr(now));
  finally
     MyList.Free;
  end;

end;

end.
.-.-.-.-.-.-.-. ^_^
ferhat71
Üye
Mesajlar: 4
Kayıt: 07 Haz 2005 09:07

Mesaj gönderen ferhat71 »

---------
TFilestream ile aç. Ama loadfromfile kullanma.

ReadBuffer ile dilediğin byte kadaroku. Buffer olarak memorystream'in buffer'ını ver. Burayı depo olarak kullan.
-----------------

merhaba bu satırı biraz açabilirmisiniz?

mem:Tmemorystream
tf:Tfilestream

tf.create(dosya,fmopenread)
tf.readbuffer(buffer,byte)

--Buffer olarak memorystream'in buffer'ını ver.--(tam olarak burayı anlamadım)
Cevapla