[DELPHI]Usuwanie powtarzających się wpisów

0

Pisze sobie program odczytujący log z EKG w ładny sposób. Wszystko działa na małych plikach z historią. Moja metoda odczytu numerów GG z loga i usunięcie się powtarzających dla 2 mb pliku to jakieś 40 sekund. Jednak np. mój log ma 78 mb :D. Czekałem i się nie mogłem doczekać przez 50 minut.

Metoda jest taka:


AssignFile(F, 'history');
Reset(F); // otwarcie pliku
try
while not Eof(F) do
begin
List := TStringList.Create;
Readln(F, linia); 
ExtractStrings([','], [],pchar(linia), List);

//list[2] to odczytany nick, a list[1] to numer gg
if not ListBox1.Items.IndexOf(List[2]+' - '+list[1]) > -1 then
  ListBox1.Items.Append(List[2]+' - '+list[1]);

//Jak widzicie powyższa część kodu zapobiega dodawaniu do listboxa wpisów, które na nim już są.

end;

finally
CloseFile(F);
end;

W 80 MB pliku historii numerów gg jest tysiące więc procedurka musi się nieźle napracować. Jest jakiś szybszy sposób usuwania powtarzających się wpisów z listy?

0

może poczytaj o TStrings.Duplicates

0

Doszedłem do wniosku, że tu nie chodzi o sposób usuwania powtarzających się linii, a o sposób wczytywania pliku do listboxa. To samo wczytywanie 80 mb pliku do listboxa tyle zajmuje. Czekał 50 minut i nic, może jeszcze pracował albo się zawiesił. Małe pliki się wczytują. Skoro 80 megowy plik w notatniku otwiera się 10 sekund to chyba można go w takim czasie wczytać do listboxa lub stringlist. Tylko jak ?

0

Używając Readln świadomie lub też nieświadomie kożystasz z dość powolnego mechanizmu który właściwie jest parserem plików tekstowych.

Jeżeli chodzi o wczytywanie tekstu do TStringList'a to posiada on metodę LoadFromFile, no ale nie wiem czy to przejdzie bo nigdy nie wczytywałem tak dużych plików.

Ostatecznie sam możesz odczytywać kolejne linie z pliku poszukując znaku końca lini zamiast korzystać z gotowych elementów delphi które nie zawsze są takie szybkie.

0

Ja swego czasu napisałem wyczesany czytnik do historii ekg. ;]
I wszystko (numery, rozmowy) trzymam na posortowanych listach, dzięki czemu, duplikaty to żaden problem. (wczytanie całego pliku ma złożoność O(n log n), przy naiwnym usuwaniu powtórek O(n^2)),(20mb historia wczytuje się kilka sekund). Dla wygody i szybkości wczytuje do TStringList, działa ekspresowo.

Ogólnie: szybkie likwidowanie duplikatów -> struktura uporządkowana.

PS: jak chcesz, moge gdzieś wrzucic mojego przeglądarka historii, ze źródełkami. :P

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