Быстрый поиск строк в большом файле
(...возникла задача и не знаю как ее рационально решить)
Исходные данные:
- Текстовый файл, состоящий из 10-30 тысяч строк
Задача:
1. Нужно в этом файле найти все строки, содержащие определенное слово (например "INSTALL")
2. Вывести все найденные строки в компонент my_RichEdit: TRichEdit (TRichEdit выбран потому, что позже в нем будет форматироваться текст)
Компиляция будет делаться на Borland C++ Builder 6.0 под Windows XP SP2
Стоит ли весь файл перед поиском загонять в буфер или лучше работать непосредственно с поиском нужных строк при чтении их из файла?
Я пробовал двумя способами, что я привел выше, но все равно время этот процесс занимает ну очень много, несколько минут, при том, что машина у меня с CPU 3 GHz, 2 Gb RAM
Спасибо.
Исходные данные:
- размер файла = 35,6 Мегабайт
- строк в файле = 454000
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
void main(void)
{
char buf [1000];
char searchstring [] = "BLOCK_READ"; //эта подстрока для поиска
std::ifstream inlog( "c:\\logfile.log", std::ios_base::in );
while( !inlog.getline( buf, sizeof( buf )).eof() )
{
if( strstr( buf, searchstring ) != NULL )
printf( "%s\n", buf );
}
}
При этом на моем ноутбуке с CPU "Celeron M" 1,5 GHz поиск строк по слову "BLOCK_READ" проходит за 40 секунд.
Может кто подскажет все же алгоритм или метод получше?
Цитата: foxby
Может кто подскажет все же алгоритм или метод получше?
Я просто обалдел от оформления алгоритмов по этой ссылке - мне понравилось. Я уже парочку попробовал, уже есть прирост скорости поиска для моей цели... но буду пробовать и остальные.
"Математику уже затем учить надо, что она ум в порядок приводит"
foxby, хочу обратить внимание, что в твоем способе есть серьзная проблема - он не найдет подстроку, если она будет лежать на стыке блоков (1000), которые ты вычитываешь из файла.
спасибо за информацию, учту на будущее.
Но для меня после нескольких испытаний вполне подходят вот эти 2 способа (GIZMO давал наводку):
http://algolist.manual.ru/search/esearch/qsearch.php
http://algolist.manual.ru/search/esearch/mismatch.php
Да, кстати, у меня не было бы проблем со стыком блоков (1000) потому что я ведь раньше считывал файл построчно, а максимальная длина строк в моих файлах не превышает 768 символов (это заложено в программе, которая создает файлы, из которых мне нужно выбирать нужные строки, а буфер размером в 1000 символов я в коде ставил для большей наглядности всего лишь ну и с небольшим запасом на время тестов)
как быстро отобразить в TRichEdit компоненте большое кол-во найденных строк, которые находятся в буфере BufList?
TStringList *BufList = new TStringList;
Вот например такой метод очень медленный:
my_RichEdit->Lines = &BufList;
Очень длинная пауза (2 мин 10 сек) при выводе на экран, если в буфере BufList несколько десятков тысяч строк.
Может каким-то образом сначала показывать только то кол-во строк, которое вместится в видимую область my_RichEdit?
А Richedit, как тут уже не раз говорили, глючный и тормозной.
У меня текстовые файлы размером до 100 Мб :(
после загрузки расход памяти = размеру текста.
// и еще у tmemo есть мелкий глючок-с. он номера строк неправильно выдает начиная с какого то порога.