Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Быстрая загрузка текстового файла!


Автор: VAVII 28.2.2006, 10:39
Приветствую!

Возникла такая проблема: есть огромный текстовый файл размером 170 метров, требуется быстро загрузить его в память и отобразить!

Если есть какие-нибудь мысли делитесь!

Зарание благодарен!

Автор: Guedda 28.2.2006, 10:50
Используй TFileStream. Это самый быстрый способ.

Автор: _hunter 28.2.2006, 11:52
самый быстрый -- вообще-то отображение в память...
+ на вторую часть вопроса отвечать кто будет?..


VAVII, а ты уверен что тебе нужно отображать все 170 метров? кто их читать будет?

Автор: VAVII 28.2.2006, 19:23
Для нагляднисти желательно отобразить все!

Автор: _hunter 28.2.2006, 19:36
ну тогда бери и суй их в TListBox. ну лучше ( всетаки ) подумать нужно ли это и использовать тот же бокс, только виртуальный ( самому отрисовкой/вставкой данных заниматься ) -- тот же FileMon 100 тысяч строк за доли секунды показывает.

Автор: Guedda 28.2.2006, 21:44
Все равно винда все 170 метров не засунет в память... Он ее запихнет в файл подкачки, и будет оттуда брать... А если хочешь, чтобы все в память закинулось, используй ассемблерные вставки

Автор: _hunter 1.3.2006, 11:18
а файл подкачки это уже не память что-ли?
+ при наличии свободного места в оперативке именно туда мапа и отобразится.

P.S.
и чем тут помогут асм-вставки?

Автор: VAVII 1.3.2006, 17:00
Примерчик бы не помешал!

Автор: _hunter 1.3.2006, 17:39
примерчик чего?
если виртуализации бокса -- поиск по слову lbVirtual

Автор: Dian 1.3.2006, 18:19
Нужно читать файл по частям. Это будет самый быстрый вариант

Цитата(Guedda @ 1.3.2006, 05:44 Найти цитируемый пост)
Все равно винда все 170 метров не засунет в память...

Если есть столько свободной памяти - то почему бы и нет

Автор: VAVII 1.3.2006, 19:15
Примерчик загрузки файла через TFileStream!

Автор: _hunter 1.3.2006, 19:36
загрузки куда?
+ идем в справку и читаем, читаем, ...

Автор: pmax 15.3.2006, 17:35
Цитата

Примерчик загрузки файла через TFileStream!


У меня это реализовано примерно так:

Код

............................................................................................
Procedure TMainForm.LoadButtonClick(Sender: TObject);
Var
       f          : TStringList;
       Path    : String;        //Путь к файлу с данными
  Begin
 OpenDialog1.Filter:='*.asN';
 OpenDialog1.Title:='Открыть файл';
  if OpenDialog1.Execute then begin
   Path:=OpenDialog1.FileName;
   f:=TStringList.Create();
   f.LoadFromFile(Path);
..............................................................................................



Успехов!

Автор: Guedda 15.3.2006, 17:46
И ты считаешь, что этот пример для загрузки при помощи TFileStream?
Вот пример для этого:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Buffer: PChar;
  Stream: TFileStream;
  Size:   LongInt;
begin
  Stream := TFileStream.Create('Unit1.pas', fmOpenRead);
  try
    Size := Stream.Size;
    GetMem(Buffer, Size);
    try
      Stream.Read(Buffer[0], Size);
      Memo1.Lines.Text := Buffer;
    finally
      FreeMem(Buffer);
    end;
  finally
    Stream.Free;
  end;
end;

Автор: pmax 16.3.2006, 10:34
Цитата

И ты считаешь, что этот пример для загрузки при помощи TFileStream?


Нет, но для работы с текстовыми файлами удобнее пользоваться объектом TStrings...
Правда не знаю какой объект быстрее TFileStream или TStrings, поверю Guedda.

P.S. Файл размером 35 метров у меня загружается за 5 сек. (но я закачиваю не всю информацию файла).

Автор: Alexeis 16.3.2006, 10:54
Можно попробовать закачивать файл вручную.
По опыту знаю, что максимальная скорость загрузки достигается при загрузке данных блоками от 2х до 10 мБ

Автор: Демо 16.3.2006, 11:16
Цитата(pmax @ 16.3.2006, 10:34 Найти цитируемый пост)
Правда не знаю какой объект быстрее TFileStream или TStrings,


И тот , другой используют одни и те же функции для чтения.
Другое дело, что затем нужно с данными делать.

>Автор.

В случае, если достаточно памяти на компьютере, можно воспользоватся самым простым методом:
1. Весь текст загружаем в TStringList.
2. В TListBox отображаем(коипируем из TStringList только те строки, которые необходимы для отображения(т.е. используем метод движущегося фрейма).

Автор: pmax 16.3.2006, 12:53
Цитата

В TListBox отображаем(коипируем из TStringList только те строки, которые необходимы для отображения


Что то не понимаю, зачем их отображать в TListBox, почему нельзя их в массив откинуть и далее с ним работать? По моему так удобнее, или нет?

Автор: Демо 16.3.2006, 13:40
Цитата(pmax @ 16.3.2006, 12:53 Найти цитируемый пост)
Что то не понимаю, зачем их отображать в TListBox, почему нельзя их в массив откинуть и далее с ним работать?

По условию задачи строки надо отображать.


Цитата(pmax @ 16.3.2006, 12:53 Найти цитируемый пост)
По моему так удобнее, или нет?


Вряд ли.

Автор: pmax 16.3.2006, 14:38
Цитата

По условию задачи строки надо отображать.


Не заметил.

Просто у меня примерно такая же задача, только мне нужны определенные значения из файла, для последующей их обработки.

Автор: Демо 16.3.2006, 14:41
Цитата(pmax @ 16.3.2006, 14:38 Найти цитируемый пост)
только мне нужны определенные значения из файла,


Ну в твоем случае намного проще прочитать файл построчно и выбрать только те строки, которые нужны (ReadLn);

Автор: pmax 16.3.2006, 15:01
Цитата

Ну в твоем случае намного проще прочитать файл построчно и выбрать только те строки, которые нужны (ReadLn);


Строки то мне нужны все а вот информация из каждой строки нужна выборочная. smile

Пример считываемого файла:

File: C:\EMT-SW\EMT-SCUT\BRC339.AS4
> 00001 2003/12/10 - 10:45:02 SN:1485 SC:0150 CH:05 TG:32 ST:00 SA:00
>> Ch Flag: 0 0 0 0 0 BY:3 SR:00150 Cyc/Sec. CK:4 TE: 000000000uS.
1 527 1045 1551 -1498 -1283
2 769 833 2213 -1768 -1135
3 595 890 2211 -3115 -1013
4 366 945 2459 2533 -1200
5 800 800 2111 1466 -1007
6 746 799 1599 -2573 -778
7 511 906 1245 -1051 -743
8 679 851 741 -685 -611
9 895 789 909 -3835 -879
10 497 771 636 -3579 -857
11 582 852 -663 14 -483

И так 35Mb...

Автор: Демо 16.3.2006, 17:50
Ну 35Мб в наше время - немного.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)