Wczytywanie duzych plikow textowych

0

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.

0

Poczytaj o TStringList.

0

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

0
proqix napisał(a)

rysowanie znaków zajmuje trochę czasu i cykli procka...

  Memo.Lines.BeginUpdate;
  //przetwarzanie linijek
  Memo.Lines.EndUpdate;
0

Dzieki wielki Tstringlist zalatwia sprawe wszystko zajmuje znacznie mniej czasu.

0

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?
0

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...

1 użytkowników online, w tym zalogowanych: 0, gości: 1