Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];

Вниз

помогите оптимизировать код   Найти похожие ветки 

 
ddrum   (2004-02-20 19:29) [0]

есть код, его задача - найти сколько раз в файле встречается определенная фраза(пусть будет "delphi")

var
F: File;
Found: array[0..5] of Char;
begin
AssignFile(F, FileName);
Reset(F, 1);
Pos:=Start;
I:=0;
while not Eof(F) do
begin
Seek(F, Pos);
BlockRead(F, RIFF, SizeOf(RIFF));
if Found = "DELPHI" then I:=I + 1;
Pos:=Pos + 1;
end;
CloseFile(F);
end;

проблема в том, что работает он очень медленно, так как перебирает файл по байту, и поэтому четние файла даже в 2 мега длится около минуты, кто-нибудь может помочь сделать этот код быстрее?


 
ddrum   (2004-02-20 19:30) [1]

№!№%№"%"№%, ошибся, где написано "riff" должно, само-собой, стоять "found" :)


 
Anatoly Podgoretsky   (2004-02-20 19:37) [2]

Еще бы ты же каждую букву начиная с 6 читаешь 6 раз, ты не мог бы прочитаь весь блок и по нему искать, даже несколько сотен мегабайт будет по быстрее минуты.


 
miek   (2004-02-20 19:43) [3]

var
F: File;
Found, buff: array[0..5] of Char;

count, l: integer;
mem: pointer;
ptr: ^byte;
begin
// ...
// загрузить строку в Found,
// имя файла в filename

AssignFile( F, FileName);
Reset( F, 1);
l:= filesize( f);
getmem( mem, l);
blockread( f, mem^, l);
closefile( f);

Pos:= Start;
ptr:= mem;
for i:= 0 to l-1-length( found) do
begin
if ptr^=found[0] then
begin
move( ptr^, buff, sizeof( found));
if comparemem( found, buff, sizeof( buff)) then
inc( count);
end;
inc( integer( ptr));
end;
freemem( mem);

// count - число вхождений
end;


 
default   (2004-02-20 19:54) [4]

считывай файл кусками в оп-ку и ищи что нужно каким-нить быстрым алгоритмом поиска подстроки в строке


 
Cobalt   (2004-02-21 01:03) [5]

Может, отображаемый в память файл поможет?


 
Defunct   (2004-02-21 01:30) [6]

> проблема в том, что работает он очень медленно, так как перебирает файл по байту, и поэтому четние файла даже в 2 мега длится около минуты, кто-нибудь может помочь сделать этот код быстрее?

Как Вам тут уже правильно отметили файл нужно вначале полностью или часично загрузить в ОП. Оно у Вас тормозит потому что диск - блочное устройство, при каждом чтении даже одного байта с диска считывается целый кластер (размер кластера зависит от файловой системы и объема диска, может быть от 512-ти байт до 64Kb).

Считали файл в ОП - оптимизировали на порядок, это еще не все.
Можно еще на порядок увеличить скорость поиска если минимизировать количество строковых операций, т.е. можете искать побайтово только первый символ вашей строки, при успешном результате, проверить оставшуюся часть.


 
Anatoly Podgoretsky   (2004-02-21 12:21) [7]

Не только побайтно, а 6 раз каждый байт


 
Defunct   (2004-02-21 12:26) [8]

> Не только побайтно, а 6 раз каждый байт

Так отож, чтобы не было 6 или 100 раз каждый байт: - проверять только первый байт, несовпал позиционируемся дальше и т.д. Если совпал, тогда проверяем второй байт и т.д.


 
Cobalt   (2004-02-21 14:12) [9]

Товарищи, ну вы, прям, я не знаю как кто...
Помните SIMM? И почему их ставили парами на пеньки?
Потому что Пенёк за один раз из памяти считывал двойное слово. Меньше ну не мог он.
Т.е. если строка длиннее 1-го символа - сравнивать надо сразу первые два байта.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
14-6204
BALU1111
2004-02-11 12:31
2004.03.03
Продолжение вопроса Intel vs AMD


9-5932
Zorik
2003-08-19 14:55
2004.03.03
Алгоритм числа


7-6257
DiMoon
2003-12-15 11:59
2004.03.03
Работа с LPT


1-6091
jel
2004-02-21 23:13
2004.03.03
Дата создания файла и HTTP протокол


1-6044
Случайно забежавший
2004-02-21 12:55
2004.03.03
StringGrid и OnKeyPress





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский