как быстрее всего считывать данные из файла

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

26 мар 2007, 11:44

есть много текстовых файлов с данными
нужно как можно быстрее считать данные по строчно.
и еще нужно пропускать строки с первым символом # т.е надобы сначала считывать один символ а потом всю строку.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

26 мар 2007, 11:53

Считываешь каждый файл в массив. В массиве ищешь $0d0a - комбинация перевода строки и возврата каретки. Каждая строка завершается этой комбинацией. Потом разбиваешь на строки учитывая вышесказанное. При большом числе строк - порядка 1000 и более - скорость чтения строк может возрасти в десятки раз.
It's a long way to the top if you wanna rock'n'roll
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

26 мар 2007, 13:36

а как быстрее в массив считать?
Аватара пользователя
SergeyS
Сообщения: 193
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

26 мар 2007, 13:57

TStringList рулит
TStringList.LoadFromFile... - загрузка файла
TStringList - доступ к строкам файла
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

26 мар 2007, 13:59

&quot писал(а):а как быстрее в массив считать?
BlockRead(File,Buffer,Count,rCount) - считывает блок данных, размером Count записей в область данных Buffer из файла File. Фактически прочитанное число записей возвращается в rCount.

Код: Выделить всё

var
Buf : PByteArray;
F    : File;

Procedure ReadFile;
begin
AssignFile(F, 'D:\DDD.TXT');
Reset(F, 1); // Длина записи - 1 байт.
GetMem(Buf, 1048576); // выделить 1М для буффера
Blockread(F, Buf[0], 1048576);
CloseFile(F);
...
...
FreeMem(Buf);
end;
&quot писал(а):TStringList рулит
Не совсем рулит, помедленнее немного

Код: Выделить всё

procedure TStrings.LoadFromFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TStrings.LoadFromStream(Stream: TStream);
var
  Size: Integer;
  S: string;
begin
  BeginUpdate;
  try
    Size := Stream.Size - Stream.Position;
    SetString(S, nil, Size);
    Stream.Read(Pointer(S)^, Size);
    SetTextStr(S);
  finally
    EndUpdate;
  end;
end;
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
SergeyS
Сообщения: 193
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

27 мар 2007, 06:25

&quot писал(а):Не совсем рулит, помедленнее немного
Согласен, считал данные ты быстрее, но их ведь после этого нужно будет построчно разобрать и наверно ещё кучу разных манипуляций произвести... а работа с сырым буфером это имхо, не очень легка задачка для человека который спрашивает как быстрее считать текстовый файл
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

27 мар 2007, 16:24

Работать с сырым буфером для меня проше чем считать файл ))). Просто раньше никогда не задумывался над проблемой быстрого чтения из файла а довольно долгое время читал тупо из Memo1.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

28 мар 2007, 12:17

А зачем тебе куча текстовых файлов с данными? Засунь все данные в БД, а потом делай Sql запросы.
2B OR NOT(2B) = FF
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

28 мар 2007, 18:07

данные динамические и приходять в файловом виде. Были бы статические давно бы засунул.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

28 мар 2007, 18:30

Ну так как приходят - сразу засовывай
2B OR NOT(2B) = FF
Ответить