Поиск изображений с помощью C # в локальной папке изображений - PullRequest
3 голосов
/ 16 июня 2010

У нас есть папка с изображениями, которая содержит около миллиона изображений.Нам нужно написать программу, которая будет извлекать изображение на основе ключевого слова, введенного пользователем.Нам нужно сопоставить имена файлов при поиске, чтобы найти правильное изображение.Ищу любые предложения.Спасибо N

Ответы [ 9 ]

4 голосов
/ 16 июня 2010
  1. Храните изображения на отдельном сайте или поддомене. Конечно, вам, возможно, не нужны все файлы 1M в одном каталоге.

  2. Вам нужна база данных с (как минимум) тремя таблицами:

    ImageFile  
        ID  
        Filepath

    Keyword
        ID
        theWord

    ImageKeyword
        ImageID
        KeywordID
2 голосов
/ 16 июня 2010

В зависимости от операционной системы, я предлагаю вам использовать службу индексирования, Windows Desktop Search или последнюю версию Windows Search.Это решает проблему поиска файлов по ключевым словам, решает проблемы с производительностью в отношении количества файлов в папке, масштабируется и легко расширяется.

Пример DSearch на http://msdn.microsoft.com/en-us/library/dd940335(VS.85).aspx делает почти то, что вы хотите, и это легко реализовать.

Например, если запрашивается миллион файлов и вам нужно переместить файл в подпапки для повышения производительности, вы можете просто создать папки и переместить файлы.Вам не нужно будет менять код.

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

Для более поздних операционных систем вы делаетедаже не нужно устанавливать какое-либо программное обеспечение, потому что функция поиска является частью операционной системы и доступна через OleDB.Если вы хотите использовать Расширенный синтаксис запроса (AQS), Microsoft предоставляет типизированную библиотеку для доступа к интерфейсам COM, которая упрощает создание команды SQL для запроса базы данных индекса.

Честно говоря, все эти другие предложения о базах данных и т. Д. - пустая трата времени.

  • MSDN-поиск windows search в http://social.msdn.microsoft.com/Search/en-US?query=windows+search

  • Связанные технологии поиска до Поиск Windows в http://msdn.microsoft.com/en-us/library/bb286798(VS.85).aspx

  • Поиск миллионов файлов в одной папке будетнепомерно медленный. (См. мой ответ на Расчет размера файла каталога - как сделать это быстрее? для Расчет размера файла каталога - как сделать это быстрее? .

  • Я могу искать на моем жестком диске ~ 300 000 файлов для * tabcontrol.cs "менее чем за секунду. Первый запрос занимает около 4000 мс, а каждый запрос, используя другой поисковый запрос, после первогоодин занимает 300-600 мс.

    • Я просто обноваот «Служба индексирования» до «Поиск Windows», и я могу выполнить поиск «filename: tabcontrol» за 3005 файлов размером более 58 ГБ за 1,25 секунды, а последующий поиск займет от 0,13 до 0,26 секунды.
  • См. Образец DSearch в http://msdn.microsoft.com/en-us/library/dd940335(VS.85).aspx, чтобы узнать, как легко это реализовать.

  • «Поиск на рабочем столе» в http://blogs.msdn.com/b/coding4fun/archive/2007/01/05/1417884.aspx

    Поиск файла на жестком диске - это медленная и утомительная операция.Узнайте, как воспользоваться преимуществами API поиска и базы данных Windows Desktop для быстрого поиска файлов.Добавьте новые инновационные функции в свои приложения, используя возможности поиска, встроенные в Vista и доступные для Windows XP.

2 голосов
/ 16 июня 2010

Это очевидно, но можно предположить, что это будет довольно медленно для миллиона изображений:

public IList<string> GetMatchingImages(string path, string keyword)
    {
        var matches = new List<string>();

        var images = System.IO.Directory.GetFiles(path);

        foreach (var image in images)
        {
            if (image.Contains(keyword))
            {
                matches.Add(image);
            }
        }

        return matches;
    }
2 голосов
/ 16 июня 2010

Хранить все (изображения и ключевые слова) в базе данных.

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

И у вас будет гораздо более быстрый доступ к метаданным (имя файла, дата создания и т. Д.) Без извлечения (или открытия) самого изображения.

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

1 голос
/ 16 июня 2010

Получение миллиона имен файлов из папки займет много времени.Я бы посоветовал вам получить имена файлов и поместить их в базу данных.Таким образом, вы можете искать имена в течение нескольких секунд, а не минут.

0 голосов
/ 16 июня 2010

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

Если это не сработает, только тогда ищите причудливые решения.

0 голосов
/ 16 июня 2010

Одним из простых решений является база данных, в которой вы храните поле ID, путь и поле varchar (строка), в котором вы сохраните все ключевые слова. (Это может быть сохранено в другой таблице для повышения эффективности)

Таким образом, вы можете осуществлять поиск по имени файла или по ключевым словам, связанным с изображением.

0 голосов
/ 16 июня 2010

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

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

Я бы начал с поиска некоторых реализаций в перевернутом списке.

0 голосов
/ 16 июня 2010

Существует Win32 API FindFirstFile, FindNextFile, FindClose: http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx - возможно, они как-то отображаются и в .NET.Используйте их для поиска изображения без каких-либо баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...