Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
1-6068
TUser
2004-02-21 15:34
2004.03.03
statistics


1-6103
ancara
2004-02-20 19:24
2004.03.03
Создание TButton


4-6272
v_v_c_c
2003-12-25 06:27
2004.03.03
Прозрачное Окно


1-6049
Слава_
2004-02-13 22:34
2004.03.03
Подскажите пожалуйста по TrayIcon


14-6242
Dimman
2004-02-10 19:04
2004.03.03
бот для чата