Поиск по этому блогу

вторник, 20 декабря 2011 г.

Компонент для чтения больших файлов TJclAnsiMappedTextReader

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;