|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"高速テキスト検索"
TMemoryStreamを用いた高速ファイル検索の例です。
この例では例としてシンプルにするためにイカの必要な処理を省いております。
1.一バッファに複数キーワードがあったときの処理
2.バッファ境界の2バイト文字でキーワードが1文字だったとき 2バイト文字の
後ろ半分と前半分でできる組み合わせがヒットする可能性の除去
これらに関しては個別にまた、質問なりサンプルなりがで対応しましょう。
ちなみにNormal Pentium200+48MByteで13メガのmes6のログは
1.5秒で検索し切ります。
procedure TForm1.Button1Click(Sender: TObject);
const buffsize=8192;
var
ms:TMemoryStream;
f:file;
theFilename:string;
time,theSize,i,count:integer;
keyW:string;
buf:array[0..buffsize]of char;
begin
keyW:='イカ';
time:=getTickCount;
theFilename:='e:\nifterm\fdelphi\room06.txt';
assignFile(f,theFilename);
reset(f,1);
theSize:=fileSize(f);
closeFile(f);
ms:=TMemoryStream.create;
try
ms.size:=theSize;
ms.loadfromfile(theFilename);
count:=0;
for i:=0 to Trunc(theSize/(buffsize-Length(KeyW)+1))+1 do
begin
ms.read(buf,buffsize);
if pos(keyW,buf)<>0 then inc(count);
//↑スピードは落ちるがAnsiPosの方がいいかも、、
ms.position:=ms.Position-Length(KeyW)+1;
{↑キーワードが境界で泣き別れてヒットしないのを
防ぐオーバーラップ}
end;
showmessage(inttostr(getTickCount-time)+' '+inttostr(count));
finally
ms.free;
end;
end;
☆☆☆ わからないときサンプル蔵 わかったときサンプル蔵 ☆☆☆
98/03/08(日) 17:03 凛(MXB01744)
Original document by 凛 氏 ID:(MXB01744)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|