Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение из 2-х гигового лога...


Страницы:   1 2 3 4

Owa ©   (2008-02-04 23:24:00) 

Здравствуйте, хочу у вас поинтересоваться какой метод лучше применять для быстрого поиска в файле?

Лог сервера. Лог текстовой с кодировкой юникод.

Я использую вот что:


var
 BaseItem : string;
 F : textfile;
 STL: TStringList;
begin
if key = VK_return then
begin
STL := TStringList.Create;

AssignFile(F, FP);
reset(f);
try
 while not Eof(F) do
  begin
   Readln(F, BaseItem);
    If pos(pchar(AnsiLowerCase(Edit1.Text)), pchar(AnsiLowerCase(BaseItem))) <>0 then
       STL.Add(UTF8Decode(BaseItem));
       Application.ProcessMessages();
  end;

finally
 CloseFile(F);
end;

RichEdit1.Lines.Text := STL.Text;
Application.ProcessMessages();

STL.Free;
end;


При маленьком объеме файла результат получается давольно быстро. А когда произвожу поиск в файле размером больше 2 гигов то процесс длится очень и очень долго. Есть-ли какой-то более быстрый метод для поиска в файле?
Спасибо.


DVM   (2008-02-05 15:17:00) [21]


> хам   (05.02.08 15:15) [52]

Файлы отображенные в память


хам   (2008-02-05 15:15:00) [22]

Что есть MMF то?


DVM   (2008-02-05 15:11:00) [23]

MMF - не панацея. Распространенное заблуждение, что MMF поможет ускорить поиск в огромном файле.


clickmaker   (2008-02-05 14:57:00) [24]

если запросить у MapViewOfFile сразу весь большой файл, можно получить отлуп по причине недостатка памяти.
Так что, там тоже блоками надо


Anatoly Podgoretsky   (2008-02-05 14:44:00) [25]

Кроме указаных методов, серьезное ускорение можно получить при переходе на Юникод функции.
Ну и конечно MMF, но надо подумать над алгоритмами, что бы не получить обратное.


palva   (2008-02-05 13:56:00) [26]


> хам   (05.02.08 13:49) [46]
> но см [36].

Я смотрю ваше [34] и удивляюсь.


хам   (2008-02-05 13:50:00) [27]

упраздил, конечно же, из обоих тестов :)


хам   (2008-02-05 13:49:00) [28]

> [45] palva ©   (05.02.08 13:46)
> Кстати, какая у вас версия делфи. Я делал на 7.0.

Я тоже сделал на д7, но см [36].


palva   (2008-02-05 13:46:00) [29]


> хам   (05.02.08 13:18) [43]

Кстати, какая у вас версия делфи. Я делал на 7.0.


palva   (2008-02-05 13:44:00) [30]


> Игорь Шевченко ©   (05.02.08 13:16) [41]
> palva ©   (05.02.08 13:14) [40]
> Истина очень простая - после первого теста данные находятся
> в кэше Windows и во втором тесте они читаются несколько
> быстрее.

В теории так и должно быть. Я потратил еще 5 минут, чтобы попробовать. Перед каждым тестом перезагружал машину (всю).
Второй тест:
13:23:12
13:23:24
Потом перезагрузился и запустил первый тест:
13:26.15
13:26.43


хам   (2008-02-05 13:18:00) [31]

> [40] palva ©   (05.02.08 13:14)
> Если вы хотите, чтобы до нас дошла какая-то известная вам
> высокая истина

Эта истина известна всем: виндовс кеширует и буферизирует чтение с диска.


clickmaker   (2008-02-05 13:17:00) [32]


> то чтение большими блоками, если говорить о программе на
> паскале, в разы ускоряет процесс

не всегда.
сталкивался с ситуацией, когда чтение большими блоками с CD приводило к "запинанию" и тормозам. Возможно, это зависит от конкретного привода и болванки, но учитывать это тоже нужно


Игорь Шевченко   (2008-02-05 13:16:00) [33]

palva ©   (05.02.08 13:14) [40]

Истина очень простая - после первого теста данные находятся в кэше Windows и во втором тесте они читаются несколько быстрее.


palva   (2008-02-05 13:14:00) [34]


> Игорь Шевченко ©   (05.02.08 12:24) [37]
> palva ©   (05.02.08 12:04) [31]
> У меня просьба - тесты местами поменяй ?

У меня обед кончился экспериментировать.
Если вы хотите, чтобы до нас дошла какая-то известная вам высокая истина, то вы выбрали не тот метод. Обсудите условия эксперимента, объясните подноготную, подготовьте и прогоните правильные с вашей точки зрения тесты выложите результаты - в общем, сделайте сами все то, что нам советуете. А ваш опыт и знания мы и так уважаем.

Если вернуться к сабжу, то чтение большими блоками, если говорить о программе на паскале, в разы ускоряет процесс.

> Slym ©   (05.02.08 12:18) [33]
> palva ©   (05.02.08 12:04) [31]
> плохой тест...

Ну это возможно. Напишите хороший тест или модифицируйте нужным образом мой. Возьмите к примеру второй мой тест и поменяйте коэффициент блокирования. Длину блока сделайте 50 и выложите результат. А я сейчас не могу этим заниматься.


Игорь Шевченко   (2008-02-05 12:24:00) [35]

palva ©   (05.02.08 12:04) [31]

У меня просьба - тесты местами поменяй ?

palva ©   (05.02.08 11:46) [23]


> Может быть, вы надеетесь, что Windows будет буферизовать
> и читать данные большими блоками?


Ага. Надеюсь. Более того, он это делает. Правда, "большой размер блока" - термин спорный, но несколько страниц за операцию чтения он читает.

"the Cache Manager reads further ahead for sequential access files--currently about three times more than files that are currently detected for sequential access. " (с) MSDN


хам   (2008-02-05 12:24:00) [36]

> [37] Игорь Шевченко ©   (05.02.08 12:24)
> У меня просьба - тесты местами поменяй ?

Кстати, да :)


Slym   (2008-02-05 12:24:00) [37]

на моем компе 8 секунд!:
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils,Windows;
var
 t:DWord;
 s:string;
 i:integer;
begin
 t:=GetTickCount;
 for i:=1 to 10000000 do
 begin
   s:=FloatToStr(Random);
   if s='' then exit;
 end;
 writeln(FloatToStr((GetTickCount-t)/1000));
 readln;
end.


хам   (2008-02-05 12:23:00) [38]

ЗЫ. строку «if pos(' ', s) > 0 then WriteLn('OK');» упразднил, т.к. здесь у меня D7, а в D2006 она должны быть более быстрой за счет fastMM


ketmar   (2008-02-05 12:22:00) [39]

>[23] palva©(05.02.08 11:46)
>компилятор делфи буферизует чтение данных?
…
>В сишных библиотеках
как прикажешь понимать тебя, Саид?


>[30] хам (05.02.08 11:53)
FAR использует mmf и далеко не тупой strstr().


хам   (2008-02-05 12:20:00) [40]

первый вариант: 26 с, второй: 23 с. Хотя конечно, загрузка процессора меньше во втором случае ниже раза в 3-4.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо