Obsługa plików - TStringList i wydajność

2015-01-19 23:38
0

Plik składa się z około kilkudziesięciu tysięcy linii tekstu. Na każdej wykonuję kilka operacji. Wiem na przykład, iż TStringList jest znacznie szybsze niż RichEdit/Memo. Czy jest również szybsze niż kolejno wczytywanie linii za pomocą Readln?

edytowany 1x, ostatnio: nieznany, 2015-01-19 23:40

Pozostało 580 znaków

2015-01-19 23:51

Plik składa się z około kilkudziesięciu tysięcy linii tekstu. Na każdej wykonuję kilka operacji.

Nie ładuj go do komponentu, jeżeli nie potrzebujesz wyświetlać go użytkownikowi;

Wiem na przykład, iż TStringList jest znacznie szybsze niż RichEdit/Memo.

No i nie dziw się, bo TStringList operuje w pamięci, a TRichEdit (to dopiero krowa) i TMemo to komponenty, więc oprócz operacji na danych w pamięci, dochodzi też aktualizowanie interfejsu, co nie należy do super szybkich operacji; Oczywiście można skorzystać z metod BeginUpdate i EndUpdate, ale liczy się także przeznaczenie tych elementów; Komponentów używaj do pokazywania użytkownikowi pewnych danych, a do niejawnych operacji na danych korzystaj z dedykowanych struktur;

Czy jest również szybsze niż kolejno wczytywanie linii za pomocą Read?

Nie sądzę, ale to powinieneś sam sprawdzić, wykonując testy;

Jeżeli na każdej linii potrzebujesz wykonać kilka operacji, gdzie linie nie są ze sobą w jakiś sposób powiązane, to nie musisz całości ładować do pamięci; Czyli jeżeli podczas operacji na danej linii nie potrzebujsz mieć dostępu do którejkolwiek innej linii (wcześniejszej lub późniejszej), to nie potrzebujesz ładować całego pliku do pamięci; Możesz użyć instrukcji Readln, jednak to jest sposób odczytywania danych z plików rodem z Turbo Pascala;

Użycie strumienia jest rozwiązaniem wygodniejszym, jednak w przypadku obsługi plików tekstowych, nie jest to proste; Nie można skutecznie określić, ile bajtów (bądź znaków) zawierają kolejne linie, stąd trzeba ładować dane blokami, a następnie ekstrahować konkretne linie, po znalezieniu znaku(ów) separatora (zależnie od platformy); Zobacz jak wygląda implementacja metody TStrings.LoadFromFile - cuda na kiju, ale sprawne cuda;

Podsumowując - obstawiam, że czytanie po jednej linii i wykonywanie od razu operacji na nich będzie wystarczająco szybkie, do tego nie będzie pamięciożerne; Algorytm będzie potrzebował tyle samo pamięci zarówno dla małych plików, jak i dla gigabajtowych potworów (oczywiście zależnie od długości pojedynczych linii); Kwestia tylko tego, co konkretnie potrzebujesz zrobić, bo dla różnych przypadków dobre mogą być różne rozwiązania.


edytowany 5x, ostatnio: furious programming, 2015-01-19 23:55

Pozostało 580 znaków

2015-01-20 00:02
0

Nie ładuję pliku do komponentu, Memo i RichEdit miały jedynie posłużyć jako przykład, znam ich wydajność. Tak jak napisałeś, TStringList ma tą zaletę że w każdej chwili mogę odnieść się do dowolnej linii.

Nie sądzę

Taką odpowiedź uważam za wystarczającą ;)

No to ja się tyle naprodukowałem, a Ty dwóch słów oczekiwałeś... :> - furious programming 2015-01-20 00:03
Resztę uznałem jako ciekawy dodatek ;) - nieznany 2015-01-20 00:10

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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