![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение из 2-х гигового лога...
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.