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?
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.
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ą ;)