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 гигов то процесс длится очень и очень долго. Есть-ли какой-то более быстрый метод для поиска в файле?
Спасибо.


хам   (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]

Не то ткнул для выделения кода по запаре, простите..


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

Наверх

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