Czołem.
Bez kodu będzie za to spróbuję wyjaśnić gdzie leży problem i może ktoś mi podpowie jak skutecznie go rozwiązać.
Mam setki plików tekstowych w znanym formacie. Konkretnie są to pliki zawierające informacje o numerycznym modelu terenu. Taka siatka z oczkiem co 1 m gdzie w węzłach tej siatki podane są wartości nad poziom morza. Pliki te pokrywają swoim zasięgiem (przestrzennym) jakiś fragment np gminy.
Użytkownik ma do dyspozycji środowisko w którym rysuje coś, np przebieg dróg, sieci miejskich itp. Rysunek jest pierwotnie płaski, czyli bez składowej wysokości. W pewnym momencie użytkownik może zaznaczyć wiele punktów tej swojej struktury, dla których należy odczytać hurtem rzędne z wyżej wspomnianych plików. Może to zrobić później, nie w momencie rysowania swojego obrazka.
Struktura plików tekstowych jest taka, że łatwo mogę określić w której linii pliku i w której kolumnie tej linii znajduje się potrzebna mi liczba. Problemem jest jednak szybkie dotarcie do tej linii. Obecnie za pomocą ReadLn w pętli przeskakuję do oczekiwanej linii i później już leci. Niestety, ta część kodu zajmuje mi zdecydowanie najwięcej czasu i dla kilku tysięcy punktów potrafi skutecznie zadławić aplikację na kilka minut. Chciałbym skrócić ten czas ile się da ale nie kosztem wczytywania całego pliku do strumienia. To może być jeszcze bardziej czasochłonne. Owszem, jednorazowe wczytanie całego pliku i później wielokrotne przeszukiwanie go wydaje się być bardzo skuteczne do momentu, w którym okazuje się, że punkty leżą na obszarach opisanych dziesiątkami różnych plików i wtedy zaczyna się sieczka, która w skrajnie niekorzystnym przypadku może prowadzić do sytuacji, gdzie co punkt to czytanie całej sekcji, która może mieć od kilkudziesięciu do kilkuset MB. Na SSD to jeszcze z bólem ale przejdzie natomiast na starszych maszynach już nie bardzo a że moimi klientami są póki co posiadacze maszyn z HDD więc wicie, rozumicie...
Myślałem nad wcześniejszym sortowaniem punktów tak by były ustawione grupami w każdej sekcji i wtedy każdą sekcję w całości czytam raz ale to będzie wymagać głębokiej rzeźby w obecnym kodzie. Zanim to popełnię chciałem zapytać o jakieś skuteczniejsze pomysły. Najlepiej gdyby udało się załatwić to przez coś na kształt ReadLn(f, nr_linii, string_z_linią) no ale nie sądzę by to było w zasięgu.