TJclAnsiMappedTextReader - Быстрое чтение текстового файла очень больших размеров
Unit JclFileUtils
В JCL есть TJclAnsiMappedTextReader и TJclWideMappedTextReader основанных на mapped-файлах. Есть свойства Lines[LineNumber: Integer] и LineCount.
При создании Reader'ов можно задать параметр создания индекса.
Произвольный доступ к строкам работает очень быстро и память расходуется только на массив позиций строк.
Но, конечно, есть ограничение винды на максимальный размер mapped-файла.
Максимальный размер файла на FAT16 = 2Гб, на FAT32 = 4Гб. На NTFS максимальный размер ну очень большой
Чтение текстового файла
(из примеров)
TextListView: TListView;
Private
FFileName: string;
FTextReader: TJclMappedTextReader;
uses
JclCounter, JclSysUtils;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(FTextReader);
end;
var
C: TJclCounter;
LineCount: Integer;
LineCountTime: Extended;
begin
FreeAndNil(FTextReader); //
FFileName := '';
TextListView.Items.Count := 0;
StatusBar.Panels[0].Text := '';
StatusBar.Panels[1].Text := '';
ClearLabels;
FTextReader := TJclAnsiMappedTextReader.Create(FileName);
FFileName := FileName;
StartCount(C);
LineCount := FTextReader.LineCount;
LineCountTime := StopCount(C);
TextListView.Items.Count := LineCount;
TextListView.Invalidate;
StatusBar.Panels[0].Text := ExtractFileName(FileName);
StatusBar.Panels[1].Text := Format('Lines: %d, time: %.2f ms', [LineCount, LineCountTime * 1000]);
end;
procedure TMainForm.TextListViewData(Sender: TObject; Item: TListItem);
begin
Item.Caption := string(FTextReader.Lines[Item.Index]);
end;
Unit JclFileUtils
В JCL есть TJclAnsiMappedTextReader и TJclWideMappedTextReader основанных на mapped-файлах. Есть свойства Lines[LineNumber: Integer] и LineCount.
При создании Reader'ов можно задать параметр создания индекса.
Произвольный доступ к строкам работает очень быстро и память расходуется только на массив позиций строк.
Но, конечно, есть ограничение винды на максимальный размер mapped-файла.
Максимальный размер файла на FAT16 = 2Гб, на FAT32 = 4Гб. На NTFS максимальный размер ну очень большой
Чтение текстового файла
(из примеров)
TextListView: TListView;
Private
FFileName: string;
FTextReader: TJclMappedTextReader;
uses
JclCounter, JclSysUtils;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(FTextReader);
end;
var
C: TJclCounter;
LineCount: Integer;
LineCountTime: Extended;
begin
FreeAndNil(FTextReader); //
FFileName := '';
TextListView.Items.Count := 0;
StatusBar.Panels[0].Text := '';
StatusBar.Panels[1].Text := '';
ClearLabels;
FTextReader := TJclAnsiMappedTextReader.Create(FileName);
FFileName := FileName;
StartCount(C);
LineCount := FTextReader.LineCount;
LineCountTime := StopCount(C);
TextListView.Items.Count := LineCount;
TextListView.Invalidate;
StatusBar.Panels[0].Text := ExtractFileName(FileName);
StatusBar.Panels[1].Text := Format('Lines: %d, time: %.2f ms', [LineCount, LineCountTime * 1000]);
end;
procedure TMainForm.TextListViewData(Sender: TObject; Item: TListItem);
begin
Item.Caption := string(FTextReader.Lines[Item.Index]);
end;