Wczytywanie duzych plikow textowych

Wczytywanie duzych plikow textowych
D0
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:4
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.

GM
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:152
0

Poczytaj o TStringList.

edytowany 1x, ostatnio: Golden_Mind
PR
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:304
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


CodeGear Delphi 2007 | Windows 7 |
Jak to dobrze że istnieje opcja edytuj post ;]
MA
"Memo ma ograniczenie do 2G - RAM". Skąd taka informacja?
Misiekd
z dokumentacji, ale kto by sobie tam zawracał dupę jakąś głupią dokumentacją... http://msdn.microsoft.com/en-us/library/bb761647(VS.85).aspx
MA
No fakt, ale tylko dla platformy NT, bo pamiętam kiedyś za czasów Win98 jak mój program tworzył loga ze swojej pracy w Memo, to dopisywanie tekstu po jakimś czasie się zatrzymywało i zapewne ilość znaków doszła do 64kB. Zamiana Memo na RichEdit-a rozwiązała ten problem :-)
pelsta
  • Rejestracja:prawie 19 lat
  • Ostatnio:13 dni
  • Postów:819
0
proqix napisał(a)

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

Kopiuj
  Memo.Lines.BeginUpdate;
  //przetwarzanie linijek
  Memo.Lines.EndUpdate;
Zobacz pozostałe 4 komentarze
Misiekd
no to po co pisałeś cokolwiek jak nie chodzi ci o ten temat?? Napisałem wyraźnie, że "MEMO NIE SŁUŻY DO PRZECHOWYWANIA TEKSTU TYLKO DO JEGO WYŚWIETLANIA" a ty pytasz co jeśli chce wyświetlić? Czytasz w ogóle to co inni piszą czy tak sobie piszesz dla samego pisania?
flowCRANE
Owszem, przeczytałem, jednak mam dodatkowe pytanie odnośnie właśnie sytuacji, kiedy trzeba wczytać większy plik i go wyświetlić; Widzę, co napisałeś, więc rozumiem o co Ci chodzi; Swoją drogą to komentarze są właśnie po to, by napisać czy zapytać się o coś, co nieznacznie odbiega od tematu; Strasznie nerwowy jesteś...
xeo545x39
@Misiekd ma rację, kolega w temacie napisał, że chce tylko robić operację na tekście, więc na kija mu wyświetlanie? Co prawda @furious programming zapytałeś się co do wyświetlania, ale misiekd cały czas mówi o tym, że jak się robi operacje na tekście to nie w memo. Teraz misiekd powiedz mu spokojnie czy wersja @pelsta do wyświetlania dużych ilości tekstu jest dobra :]
Misiekd
to zależy czy autor zakłada, że użytkownik będzie cierpliwy. Ew. że użytkownik naprawdę wie co robi, i że wczytanie CAŁEGO np. 1GB pliku tekstu MUSI chwilę potrwać.
flowCRANE
@xeo545x39, właśnie o to chodzi; Ja tylko zapytałem tak dla własnej wiadomości, nie nawiązując do tematu; Dowiedziałem się, że można użyć TStringList lub strumieni - dzięki za informacje; Co do tematu - wczytywanie tak dużego pliku zawsze będzie trwało, więc trzeba się zastanowić, jak zminimalizować ten czas;
D0
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:4
0

Dzieki wielki Tstringlist zalatwia sprawe wszystko zajmuje znacznie mniej czasu.

pelsta
  • Rejestracja:prawie 19 lat
  • Ostatnio:13 dni
  • Postów:819
0

W związku z zaistniałą dyskusją przetestuj takie 2 kody na twoim pliku i podaj nam wyniki

Kopiuj
var t:LongWord;
  t:=GetTickCount;
  with TStringList.Create do
  begin
    LoadFromFile(nazwapliku);
    Free;
  end;
  t:=GetTickCount-t;
  //ile wynosi t?
Kopiuj
var t:LongWord;
  t:=GetTickCount;
  with Memo.Lines do
  begin
    BeginUpdate;
    LoadFromFile(nazwapliku);
    EndUpdate;
  end;
  t:=GetTickCount-t;
  //ile wynosi t?
pelsta
Po przetestowaniu okazało się, że sekwencja BeginUpdate/EndUpdate nie wpływa na czas wykonania metody LoadFromFile.
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
0

proszę bardzo, kod

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 3x, ostatnio: Misiekd
pelsta
Opanuj się. Prosiłem autora wątku aby sprawdził, jak moja propozycja wpłynie na czas ładowania pliku (pisał o 10 sekundach). Ale gościu jest zajęty i nie ma czasu
pelsta
Nie twierdziłem, że w tym przypadku TMemo jest lepsze niż TStringList tylko pokazałem, jak można skrócić czas jeżeli już ktoś używa TMemo. Zauważ, że każdy początkujący programista zanim odkryje TStringList będzie używał TMemo - jednak nie należy go za to o........ć.
flowCRANE
@Misiekd od jakiegoś czasu nie umie inaczej napisać posta, jeśli ktoś pyta o podstawy, lub nie poczytał o tym sam; Jeżeli ktoś prezentuje kod, który nie jest najlepszej jakości ale działa, to należy podać szybsze rozwiązanie a nie ciskać się, że każdy wolniejszy kod jest c****; Nie każdy pracuje jako programista więc gadkę o 'kierowniku' sobie daruj; Człowieku panuj nad nerwami, nikt Ci na złość nie chce zrobić;

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.