250 MB text dosyası nasıl işlenir
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
250 MB text dosyası nasıl işlenir
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?
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?
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
.-.-.-.-.-.-.-. ^_^
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ç
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ç
kısmi yüklemeyi beceremedim, yapabildiğim :
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ı?
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ı?
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
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.

not : herhalde kaydetmenin uzun sürmesi benim hdd nin hantallığındandır.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![]()
======================
kaydetme başlıyor : 22:54:40
kaydetme bitti : 22:54:43
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.
.-.-.-.-.-.-.-. ^_^
---------
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)
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)