![]() |
| ||
|
|
Новости |
Поиск |
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 гигов то процесс длится очень и очень долго. Есть-ли какой-то более быстрый метод для поиска в файле?
Спасибо.
хам (2008-02-05 10:42:00) [61]> [12] Skyle © (05.02.08 10:29)
> А мягкое всяко лучше красного. И вообще, это вам не громкое.
Рад за тебя.
Skyle (2008-02-05 10:29:00) [62]
> хам (05.02.08 09:33) [11]
> > [3] DVM © (04.02.08 23:51)
> > И может читать стоит более большими блоками, чем по одной
>
> > строке?
>
> Это уже забота виндового кеша, а он, поверь, с ней справляется.
>
А мягкое всяко лучше красного. И вообще, это вам не громкое.
хам (2008-02-05 09:33:00) [63]> [3] DVM © (04.02.08 23:51)
> И может читать стоит более большими блоками, чем по одной
> строке?
Это уже забота виндового кеша, а он, поверь, с ней справляется.
Slym (2008-02-05 05:11:00) [64]а так долго ищет?
' VBScript.
Option Explicit
if WScript.Arguments.Count() = 0 Then
WScript.StdOut.WriteLine "No params"
WScript.StdOut.WriteLine "cscript.exe cf.vbs filename"
WScript.Quit()
End If
Dim RE,FSO,F
Set RE = New RegExp
RE.IgnoreCase = True
RE.Pattern = "String to find"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File= FSO.GetFile(WScript.Arguments(0))
WScript.StdOut.WriteLine ("Scan file: " + File.Path)
ScanFile File
Sub ScanFile(File)
Dim InStream,OutStream, Line
Set InStream = File.OpenAsTextStream
Set OutStream = WScript.StdOut
While Not InStream.AtEndOfStream
Line = InStream.ReadLine
If (Line<>"") and(RE.Test(Line)) Then
OutStream.WriteLine(Line)
End If
WEnd
InStream.Close()
InStream=null
End Sub
ketmar (2008-02-05 03:01:00) [65]и процитировал я поисковую фразу для гугля. по которой сразу ныжные ссылочки даёт.
ketmar (2008-02-05 03:00:00) [66]>[7] Германн ©(05.02.08 02:21)
таки двое. и завсегда было двое. параллельно с ними ещё кто-то то же придумал, и куча народу сочинила модификации.
Германн (2008-02-05 02:21:00) [67]
> ketmar © (05.02.08 00:20) [5]
>
> >[0] Owa (04.02.08 23:24)
> а чо ищем-то? Boyer–Moore string search algorithm не пойдёт?
>
>
Ну если мне не изменяет мой склероз, то авторов там всё-таки трое. "Boyer-Moore-Horspool pattern searching algorithm".
Amoeba (2008-02-05 02:15:00) [68]А может не грузить 2 гига в StringList (ЖУТЬ!!! Не дай Бог, чтобы такое приснилось), а использовать MemoryMapping и далее работать как с байтовым массивом-строкой?
ketmar (2008-02-05 00:20:00) [69]>[0] Owa (04.02.08 23:24)
а чо ищем-то? Boyer–Moore string search algorithm не пойдёт?
palva (2008-02-04 23:52:00) [70]Ускорить можно, если читать не построчно, а большими блоками ну хотя бы килобайт по пятьсот. В блоке строки не выделять и не перекодировать, а искать сразу образец. Естественно, будет кропотливое программирование, чтобы отловить случаи, когда образец оказался разделен на части границей блока: можно, к примеру, читать блоки с небольшим перехлестом, длина которого будет равна максимальной длине строки. После нахождения образца нужно выделить всю строку перекодировать и добавить в STL.
DVM (2008-02-04 23:51:00) [71]И может читать стоит более большими блоками, чем по одной строке?
DVM (2008-02-04 23:48:00) [72]
> Application.ProcessMessages();
Убери. Либо быстро либо красиво.
> AnsiLowerCase(Edit1.Text)),
Зачем каждый виток цикла делать одно и то же - переводить в нижний регистр то, что можно перевести туда до цикла?
Owa (2008-02-04 23:25:00) [73]Не то ткнул для выделения кода по запаре, простите..