Jak w temacie. Do komponentu memo wczytuje bardzo duzy plik textowy (ok 600 000 linijek) w ktorym wyszukuje i dodaje linijki.
Moj problem jest taki ze wczytywanie trwa dosc dlugo ok 10 sec.
Podobnie po wstawieniu linijki, ja uzywam memo1.lines.insert();
Poniewaz potrzebuje popodstawiac kila linijek w jednej petli zajmuje to ladnych pare minut
Zauwazylem przy tym ze na laptopie z 2 rdzeniowym procesorem program wykorzystuje zaledwie 50 % mocy, a na stacjonarnym z 4 rdzeniami to 25% mocy. Domyslam sie ze chodzi o watki tylko jak uzyc np 4 watkow do wczytania pliku textowego zapisanego w formacie i3d do komponentu memo zeby skrocic czas ladowania pliku.
- Rejestracja:około 13 lat
- Ostatnio:ponad 12 lat
- Postów:4
- Rejestracja:ponad 15 lat
- Ostatnio:ponad 11 lat
- Postów:152
- Rejestracja:około 16 lat
- Ostatnio:ponad 9 lat
- Postów:304
Zauważ że Memo ma ograniczenie do 2G - RAM a długo się wczytuje bo rysowanie znaków zajmuje trochę czasu i cykli procka...
Jeżeli nie potrzebujesz grafiki to TStringList będzie działa szybciej ja napisał kolega wyżej


- Rejestracja:prawie 19 lat
- Ostatnio:13 dni
- Postów:819
proqix napisał(a)
rysowanie znaków zajmuje trochę czasu i cykli procka...
Memo.Lines.BeginUpdate;
//przetwarzanie linijek
Memo.Lines.EndUpdate;






- Rejestracja:prawie 19 lat
- Ostatnio:13 dni
- Postów:819
W związku z zaistniałą dyskusją przetestuj takie 2 kody na twoim pliku i podaj nam wyniki
var t:LongWord;
t:=GetTickCount;
with TStringList.Create do
begin
LoadFromFile(nazwapliku);
Free;
end;
t:=GetTickCount-t;
//ile wynosi t?
var t:LongWord;
t:=GetTickCount;
with Memo.Lines do
begin
BeginUpdate;
LoadFromFile(nazwapliku);
EndUpdate;
end;
t:=GetTickCount-t;
//ile wynosi t?


- Rejestracja:ponad 21 lat
- Ostatnio:ponad 12 lat
- Postów:7923
proszę bardzo, kod
procedure TForm5.Button1Click(Sender: TObject);
var
sl: TStringList;
t: Cardinal;
mb, ma: Cardinal;
begin
mb := CurrentMemoryUsage;
t := GetTickCount;
sl := TStringList.Create;
try
sl.LoadFromFile('f:\seriale\plik50MB.txt');
t := GetTickCount - t;
ma := CurrentMemoryUsage;
finally
sl.Free;
end;
ShowMessage(Format('czas: %d pamiec: %d', [t, ma - mb]));
end;
procedure TForm5.Button2Click(Sender: TObject);
var
mm: TMemo;
t: Cardinal;
mb, ma: Cardinal;
begin
mb := CurrentMemoryUsage;
t := GetTickCount;
mm := TMemo.Create(nil);
try
mm.Parent := Self;
mm.Lines.BeginUpdate;
mm.Lines.LoadFromFile('f:\seriale\plik50MB.txt');
mm.Lines.EndUpdate;
t := GetTickCount - t;
ma := CurrentMemoryUsage;
finally
mm.Free;
end;
ShowMessage(Format('czas: %d pamiec: %d', [t, ma - mb]));
end;
procedure TForm5.Button3Click(Sender: TObject);
var
fs: TFileStream;
i: Integer;
s: string;
begin
fs := TFileStream.Create('f:\seriale\plik50MB.txt', fmCreate);
try
s := '12345678901234567890123456789012345678901234567890'#13#10;
for i := 0 to 1000000 do
fs.Write(s[1], Length(s));
finally
fs.Free;
end;
end;
function TForm5.CurrentMemoryUsage: Cardinal;
var
pmc: TProcessMemoryCounters;
begin
pmc.cb := SizeOf(pmc) ;
if GetProcessMemoryInfo(GetCurrentProcess, @pmc, SizeOf(pmc)) then
Result := pmc.WorkingSetSize
else
RaiseLastOSError;
end;
trzy uruchomienia na każdy sposób ładowania (czyli w sumie sześć)
dla stringlist
czas | pamięć |
---|---|
530 | 36864 |
499 | 36864 |
546 | 36864 |
dla memo
czas | pamięć |
---|---|
905 | 151552 |
920 | 151552 |
889 | 151552 |
WIDZISZ RÓŻNICĘ???? Czas jest "tylko" prawie dwukrotnie dłuższy dla memo, za to zajętość pamięci prawie pięciokrotnie większa
kompilowane do release, uruchamiane spoza debuggera, D XE
Ja wiem, że część (szczególnie nowych) userów tutaj uważa, że jak kogoś opierdole za jego rozwiązanie to dlatego, że nieokrzesany cham ze mnie i szczerze powiedziawszy to mnie to rybka ale jednak skoro jest to forum o programowaniu i staramy się pomagać innym to przynajmniej takim kodem, za który w normalnej pracy nie dostalibyśmy w ryj od kierownika projektu...



Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.