Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Быстрый поиск строк в большом файле

2.1K
30 апреля 2008 года
foxby
44 / / 16.07.2003
Помогите пожалуйста найти решение быстрого поиска строк в большом файле и вывода найденных в компонент TRichEdit.
(...возникла задача и не знаю как ее рационально решить)

Исходные данные:
- Текстовый файл, состоящий из 10-30 тысяч строк

Задача:
1. Нужно в этом файле найти все строки, содержащие определенное слово (например "INSTALL")
2. Вывести все найденные строки в компонент my_RichEdit: TRichEdit (TRichEdit выбран потому, что позже в нем будет форматироваться текст)

Компиляция будет делаться на Borland C++ Builder 6.0 под Windows XP SP2

Стоит ли весь файл перед поиском загонять в буфер или лучше работать непосредственно с поиском нужных строк при чтении их из файла?
Я пробовал двумя способами, что я привел выше, но все равно время этот процесс занимает ну очень много, несколько минут, при том, что машина у меня с CPU 3 GHz, 2 Gb RAM

Спасибо.
2.1K
04 мая 2008 года
foxby
44 / / 16.07.2003
Я вот пробовал использовать вот такой код (см. ниже).

Исходные данные:
- размер файла = 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 секунд.
Может кто подскажет все же алгоритм или метод получше?
246
04 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: foxby

Может кто подскажет все же алгоритм или метод получше?



Посмотри здесь

2.1K
05 мая 2008 года
foxby
44 / / 16.07.2003
GIZMO, огромное Вам спасибо!
Я просто обалдел от оформления алгоритмов по этой ссылке - мне понравилось. Я уже парочку попробовал, уже есть прирост скорости поиска для моей цели... но буду пробовать и остальные.

"Математику уже затем учить надо, что она ум в порядок приводит"
3
05 мая 2008 года
Green
4.8K / / 20.01.2000
foxby, хочу обратить внимание, что в твоем способе есть серьзная проблема - он не найдет подстроку, если она будет лежать на стыке блоков (1000), которые ты вычитываешь из файла.
2.1K
06 мая 2008 года
foxby
44 / / 16.07.2003
Green,
спасибо за информацию, учту на будущее.
Но для меня после нескольких испытаний вполне подходят вот эти 2 способа (GIZMO давал наводку):

http://algolist.manual.ru/search/esearch/qsearch.php
http://algolist.manual.ru/search/esearch/mismatch.php

Да, кстати, у меня не было бы проблем со стыком блоков (1000) потому что я ведь раньше считывал файл построчно, а максимальная длина строк в моих файлах не превышает 768 символов (это заложено в программе, которая создает файлы, из которых мне нужно выбирать нужные строки, а буфер размером в 1000 символов я в коде ставил для большей наглядности всего лишь ну и с небольшим запасом на время тестов)
2.1K
06 мая 2008 года
foxby
44 / / 16.07.2003
У меня вот теперь второй вопрос:
как быстро отобразить в TRichEdit компоненте большое кол-во найденных строк, которые находятся в буфере BufList?

TStringList *BufList = new TStringList;

Вот например такой метод очень медленный:

my_RichEdit->Lines = &BufList;

Очень длинная пауза (2 мин 10 сек) при выводе на экран, если в буфере BufList несколько десятков тысяч строк.
Может каким-то образом сначала показывать только то кол-во строк, которое вместится в видимую область my_RichEdit?
8.4K
07 мая 2008 года
Zor
104 / / 23.04.2006
Переходите на TMemo, текст 1мег/20к строк вставляется за долю секунды.
А Richedit, как тут уже не раз говорили, глючный и тормозной.
2.1K
08 мая 2008 года
foxby
44 / / 16.07.2003
А какой предельный объем у TMemo?
У меня текстовые файлы размером до 100 Мб :(
8.4K
08 мая 2008 года
Zor
104 / / 23.04.2006
а сколько памяти ни есть. у меня текст в 120мегов грузится за 12 сек, при этом в процессе расход памяти втрое превышает размер текста.
после загрузки расход памяти = размеру текста.
// и еще у tmemo есть мелкий глючок-с. он номера строк неправильно выдает начиная с какого то порога.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог