Форум: "Основная";
Текущий архив: 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.007 c