Otworzenie bardzo dużego pliku tekstowego.

0

Witam,

zastanawiam się czy można otworzyć wielki plik tekstowy (nawet 15 GB) w Delphi z możliwością podglądu (np w memo albo richedit)? Czy trzeba jakoś specjalnie się do tego przygotować czy można go otworzyć standardowo, jak każdy plik tekstowy? Chodzi mi o to, aby zbyt mocno nie zawiesić komputera ani programu. A może lepiej jest odczytywać go partiami?

Pozdrawiam!

0

Oczywiście, że można. Jednak pytanie jakimi metodami. Z tego co kojarzę, to standardowe metody ładujące zawartość pliku do TMemo/TRichEdit ładują cały plik do pamięci od razu. Co w przypadku większych plików może trwać długo, czy w końcu zabraknie pamięci. W takich przypadkach musisz ładować ręcznie zawartość pliku w paczkach po np. 10kB tak tak to robią inne edytory.

0

A w jaki sposób można ładować plik takimi paczkami?

0

Wczytywać od indexu tyle ile potrzebujesz czyli tyle ile sobie przeznaczysz by to płynnie chodziło, tak aby aktualnie wyświetlana wartość tekstu mieściła się w tym zakresie. Są funkcje, które wczytują kawałki strumieni.

0
Mr.YaHooo napisał(a)

Z tego co kojarzę, to standardowe metody ładujące zawartość pliku do TMemo/TRichEdit ładują cały plik do pamięci od razu.

Tzn. zawartość pliku ląduje w całości do pamęci, dlatego że komponenty z wieloliniowym tekstem mają w sobie obiekt klasy TStringList, który tak właśnie wykonuje załadunek danych i tego nie ma jak przeskoczyć; Chyba że napisać swój komponent;

Reiko napisał(a)

A w jaki sposób można ładować plik takimi paczkami?

Możesz wykorzystać klasę TFileStream i przesuwać sobie wskaźnik (właściwość Position) w odpowiednie miejsce, a potem metodą Read załadować dany fragment pliku do pomocniczego bufora; Jeśli tym buforem pomocniczym będzie łańcuch znaków, to będziesz go mógł bezpośrednio wpisać np. do Memo.Lines, poprzez właściwość Memo.Lines.Text;

PS: Co to za plik tekstowy, który waży aż 15GB?

0
furious programming napisał(a):

Tzn. zawartość pliku ląduje w całości do pamęci, dlatego że komponenty z wieloliniowym tekstem mają w sobie obiekt klasy TStringList, który tak właśnie wykonuje załadunek danych i tego nie ma jak przeskoczyć; Chyba że napisać swój komponent;
To by było najlepsze wyjście. Chociaż z tego co kojarzę, to gdzieś nawet widziałem taki komponent. Ale w tej chwili nie pamiętam gdzie.

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