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

Вниз

FindFirst, FindNext... Как быстрее?   Найти похожие ветки 

 
DevilDevil ©   (2009-08-10 11:24) [0]

Время не засекал, потому что бесполезно.
Поиск как-то кешируется и в следующий раз осуществляется намного быстрее.

Суть вопроса.
Какой поиск быстрее: по всем файлам/папкам или по маске ?

Предполагаю, что поиск по маске - это поиск по всем файлам, только с фильтрафией внутри FindFirst/FindNext. Или я не прав и есть какой-то крутой механизм у них?


 
DrPass ©   (2009-08-10 11:27) [1]

Поиск по маске - это функция операционной системы, и FindFirst/FindNext в обоих случаях ничего сами не фильтруют, а просто передают ей параметры твоего запроса. Насчет крутых механизмов... ну, все стандартное. Дисковый кэш - это крутой механизм?


 
DevilDevil ©   (2009-08-10 11:28) [2]

Так ответ. Быстрее или нет? Если да, то насколько?


 
Anatoly Podgoretsky ©   (2009-08-10 11:29) [3]


> Какой поиск быстрее: по всем файлам/папкам или по маске
> ?

А это от ситуации зависит, может и быстрее и медленнее. Кроме того основаная проблема это дисковые операции.


 
DevilDevil ©   (2009-08-10 11:37) [4]

Анатолий, я не понял


 
Palladin ©   (2009-08-10 11:37) [5]


> [2] DevilDevil ©   (10.08.09 11:28)

что быстрее или нет?


 
DevilDevil ©   (2009-08-10 11:44) [6]

>Palladin
осуществляется поиск

Случай 1. Фильтрация по маске осуществляется внутри FindFirst/FindNext
Происходит перебор всех файлов. Если имя файла соответствует маске, то возвращается TSearchRec.
Перебор всех файлов в таком случае будет быстрее, т.к. не происходит фильтрации

Случай 2. Фильтрация по маске осуществляется каким-то мега супеп пупер алгоритмом, позволяющим не проходить по всем файлам.
В этом случае поиск будет быстрее.

Вопрос. Как осуществляется поиск: первым случаем или вторым?


 
Anatoly Podgoretsky ©   (2009-08-10 11:49) [7]

> DevilDevil  (10.08.2009 11:44:06)  [6]

Я уже ответил, что не понятного?


 
DevilDevil ©   (2009-08-10 11:58) [8]

От какой ситуации зависит?
От чего?
Каким способом осуществляется поиск: первым или вторым?

P.S. моя задача - максимально быстрый поиск jpg, jpe, jpeg, jfif, bmp - файлов.
Стараюсь понять, как сделать быстрее.


 
Anatoly Podgoretsky ©   (2009-08-10 12:02) [9]

> DevilDevil  (10.08.2009 11:58:08)  [8]

От количества файлов попадающих под условия, худший случай маски *.*  - будут обработаны все файлы. Лучший случай, когда под условие попадает только один файл, с маской file.ext

Твоя задача подразумевает сделать это за один проход или за пять?

ЗЫ: без маски FindFirst не работает, никогда.


 
DrPass ©   (2009-08-10 12:03) [10]


DevilDevil ©   (10.08.09 11:58) [8]
> P.S. моя задача - максимально быстрый поиск jpg, jpe, jpeg,
>  jfif, bmp - файлов.
> Стараюсь понять, как сделать быстрее

Это же очевидно, что ни перебор по маске, ни перебор всех файлов не дадут тебе максимально быстрого поиска, не так ли? Сам же убедился, что особой разницы нет.
Быстрый поиск осуществляется предварительным индексированием


 
DevilDevil ©   (2009-08-10 12:15) [11]

>Anatoly Podgoretsky
>ЗЫ: без маски FindFirst не работает, никогда.

Верно. Но маска *.* широко распространена и вполне может оптимизироваться ОС, не используя фильтрацию вообще.

>Сам же убедился, что особой разницы нет.
не убедился
не производил замеров времени.

>Быстрый поиск осуществляется предварительным индексированием
?


 
DevilDevil ©   (2009-08-10 14:07) [12]

Ну хорошо
А как сформировать маску из нескольких расширений

Ну для jpg знаю - *.jpg. А для нескольких?


 
Palladin ©   (2009-08-10 14:18) [13]

*.* + ExtractFileExt


 
Anatoly Podgoretsky ©   (2009-08-10 14:27) [14]

> DevilDevil  (10.08.2009 14:07:12)  [12]

*.*


 
qwer_qwer   (2009-08-10 14:36) [15]


> DevilDevil ©   (10.08.09 11:24) 


Разбери исходник этих функций и убедишься, что не имеет значения, используешь ты маску "*.jpg" или "*.*".


 
DevilDevil ©   (2009-08-10 14:48) [16]

>qwer_qwer
у тебя есть исходник FindFirst и FindNext ?

>Palladin ©
>Anatoly Podgoretsky ©

Dir + "\*.jpg *.jpe *.jpeg *.jfif *.bmp ?


 
Медвежонок Пятачок ©   (2009-08-10 14:54) [17]

у тебя есть исходник FindFirst и FindNext ?

Он у всех есть.
А вот FindFirstFile - не у всех


 
Palladin ©   (2009-08-10 14:55) [18]


> [16] DevilDevil ©   (10.08.09 14:48)

ты читать не умеешь? ах ну конечно, я забыл F1 добавить... у всех со словом ExtractFileExt идут именно такие ассоциации...


 
DevilDevil ©   (2009-08-10 15:07) [19]

>Palladin ©
Я не понял, что ты имел ввиду.
В помощи не нашёл

Мне бы пример маски на несколько разрешений.
Больше ничего не надо


 
Anatoly Podgoretsky ©   (2009-08-10 15:11) [20]

> DevilDevil  (10.08.2009 15:07:19)  [19]

http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N157


 
Kolan ©   (2009-08-10 15:13) [21]

{************************************************************}
{                                                            }
{                    CommunicationInterface                  }
{                Copyright (c) 2009  KSoftWare               }
{                                                            }
{                                                            }
{  Разработчик: Товеровский Николай                          }
{               www.ksoftware.ru                             }
{  Модифицирован: 23 июля 2009                               }
{  Описание: Модуль для работы с файловой системой.          }
{                                                            }
{************************************************************}
unit KScanDirectory;

interface
uses
 SysUtils, Classes, ShellAPI;

{Просканировать папку и найти в ней что-то, например файлы и папки
 или просто файлы или просто папки или файлы но не все или...

 Directory — папка в которой нужо искать.
 ScanSubFolders — флаг поиска в подпапках.
 Strings — результат поиска. Объект должен быть создан.
 Extension — поиск файлов с определенным расширением,
   если ограничений нет — оставьте пустым.
 FileName — поиск файлов с определенным именем,
   если ограничений на имя нет — оставьте пустым.
 RecursionCount — бесполезный параметр, задайте 0.
 SeachOnlyDirectorys — искать только папки.}
 procedure ScanDirectory(Directory: string; ScanSubFolders: Boolean;
   Strings: TStrings; Extension: string; FileName: string;
   RecursionCount: Integer; SeachOnlyDirectorys: Boolean = False);

{Скопировать папку с подпапками и другими потрахами.}
 procedure CopyDirectoryTree(AHandle: THandle;
   AFromDir, AToDir: string);
{Скопировать файл.}
 procedure CopyFile(AHandle: THandle;
   AFromFileName, AToFileName: string);
implementation

procedure ScanDirectory(Directory: string; ScanSubFolders: Boolean;
   Strings: TStrings; Extension: string; FileName: string;
   RecursionCount: Integer; SeachOnlyDirectorys: Boolean = False);
var
 CurrentFile: TSearchRec;
begin
 Directory := IncludeTrailingPathDelimiter(Directory);
 if Assigned(Strings) and DirectoryExists(Directory) then
 begin
   try
     if FindFirst(Directory + "*.*", faAnyFile, CurrentFile) = 0 then
     begin
       repeat
         if (CurrentFile.Name <> ".") and (CurrentFile.Name <> "..") then
         begin
           if ((CurrentFile.Attr and faDirectory) <> 0) and ScanSubFolders then
             ScanDirectory(Directory+CurrentFile.Name, ScanSubFolders, Strings,
               Extension, FileName, RecursionCount + 1, SeachOnlyDirectorys);
            if (Extension = "") or (ExtractFileExt(CurrentFile.Name) = Extension) then
              if (FileName = "") or (FileName = CurrentFile.Name) then
                if (not SeachOnlyDirectorys) or ((CurrentFile.Attr and faDirectory) <> 0) then
                  Strings.Add(Directory+CurrentFile.Name)
         end;
       until FindNext(CurrentFile) <> 0;
     end;
   finally
     FindClose(CurrentFile);
   end;
 end;
end;

procedure CopyDirectoryTree(AHandle: THandle; AFromDir,
 AToDir: string);
var
 SHFileOpStruct: TSHFileOpStruct;
begin
 with SHFileOpStruct do
 begin
   Wnd := AHandle;
   wFunc := FO_COPY;
  {Про #0 не надо забывать.}
   pFrom := PChar(AFromDir+ #0);
   pTo := PChar(AToDir+ #0);
   fFlags := FOF_NOCONFIRMATION;
   fAnyOperationsAborted := False;
   hNameMappings := nil;
   lpszProgressTitle := nil;
 end;
 SHFileOperation(SHFileOpStruct);
end;

procedure CopyFile(AHandle: THandle;
 AFromFileName, AToFileName: string);
begin
 CopyDirectoryTree(AHandle, AFromFileName,
   AToFileName);
end;

end.


Добавить цикл для нескольких расширений, я думаю, труда не составит?


 
DevilDevil ©   (2009-08-10 15:16) [22]

Хороший пример
Как раз показывает то, что вы перебираете все файлы
А я говорю, что быстрее в FindFirst задать маску
В этом вопрос


 
DevilDevil ©   (2009-08-10 15:17) [23]

> Kolan ©
Тоже *.* ищешь


 
Медвежонок Пятачок ©   (2009-08-10 15:39) [24]

мда. это не лечится.


 
Медвежонок Пятачок ©   (2009-08-10 15:43) [25]

Тоже *.* ищешь

Это перебор всех файлов.
Поиск по маске "все мои картинки" (какой бы она ни была)  - это тоже перебор ВСЕХ файлов.

И другого просто быть не может.


 
DevilDevil ©   (2009-08-10 16:02) [26]

>Медвежонок Пятачок
это ты не лечишься

> Поиск по маске "все мои картинки" (какой бы она ни была)
>  - это тоже перебор ВСЕХ файлов.
> И другого просто быть не может.


Все согласны? Нет способа задать маску на несколько разширений?

Если да, то не быстрее будет 5 поисков: каждый по своему разширению?


 
Leonid Troyanovsky ©   (2009-08-10 16:04) [27]


> DevilDevil ©   (10.08.09 15:16) [22]

> Как раз показывает то, что вы перебираете все файлы
> А я говорю, что быстрее в FindFirst задать маску

Во-первых, задать несколько масок так и не удасться.
Во-вторых, в скорости проверки на соответствие имени маске
можно тягаться и с MS, хотя, конечно, нижний предел определен
скоростью дисковых операций.

See also:
http://groups.google.com/group/fido7.ru.delphi/browse_thread/thread/8c569e3e8d407b9a/32ddb7584e22e792?#32ddb7584e22e792

--
Regards, LVT.


 
Игорь Шевченко ©   (2009-08-10 16:06) [28]

Kolan ©   (10.08.09 15:13) [21]


>  другими потрахами


То ли Ленина не уважаешь, то ли не копированием, а чем-то другим занимаешься.


 
Медвежонок Пятачок ©   (2009-08-10 16:07) [29]

Все согласны? Нет способа задать маску на несколько разширений?

Ты на самом деле думаешь, что виндоус встретив твою маску не будет перебирать ВСЕ файлы, а сразу соединится с Центральным Мозгом Галактики, который сообщит ей готовый список файлов в твоем каталоге, которые удовлетворяют маске?


 
Anatoly Podgoretsky ©   (2009-08-10 16:11) [30]

> DevilDevil  (10.08.2009 16:02:26)  [26]

А рамках FindFirst нет возможностей, используй MatchesMask и небольшой цикл.


 
{RASkov} ©   (2009-08-10 16:13) [31]

> RecursionCount — бесполезный параметр, задайте 0.

:)


 
Kolan ©   (2009-08-10 16:22) [32]

Про Ленина — не понял. :)


 
Leonid Troyanovsky ©   (2009-08-10 16:22) [33]


> Игорь Шевченко ©   (10.08.09 16:06) [28]

> >  другими потрахами

> То ли Ленина не уважаешь

Игорь, sorry, напомни, please, где тут про ВИЛ?
Оговорку по фрейду отметили (один пих на уме:), но не догнали :)

--
Regards, LVT.


 
DevilDevil ©   (2009-08-10 16:47) [34]

Всем участникам спасибо.
особенно Anatoly Podgoretsky


 
Игорь Шевченко ©   (2009-08-10 17:20) [35]

Kolan ©   (10.08.09 16:22) [32]
Leonid Troyanovsky ©   (10.08.09 16:22) [33]

Да будь я негром преклонным годов,
и то без унынья и лени
Я русский бы выучил только за то...


 
Sha ©   (2009-08-10 17:40) [36]

> Kolan ©   (10.08.09 15:13) [21]

Если я правильно отследил отступы, в коде есть неточность:
FindClose может выполниться при неуспешном FindFirst.


 
Дмитрий Белькевич   (2009-08-10 21:00) [37]

Быстрее всего разбирать mft руками. Пользую и всем рекомендую everything. Ищет практически моментально среди 750 тыс файлов на моём венике. Думаю, что mft расковыривает.



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

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

Наверх





Память: 0.56 MB
Время: 0.006 c
1-1219238994
Квэнди
2008-08-20 17:29
2009.10.11
Организация взаимодействия классов


15-1250080125
desc
2009-08-12 16:28
2009.10.11
Принтер HP Officejet K7100 Series, печатает цветные полосы,


2-1249776063
D@sha
2009-08-09 04:01
2009.10.11
DBgrid присвоить значение столбцу


15-1249640879
Cyrax
2009-08-07 14:27
2009.10.11
Помогите набрать номер 8-800-100-ASUS...


2-1249545112
Dennis I. Komarov
2009-08-06 11:51
2009.10.11
AV





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский