Эффективный метод для мгновенного управления и поиска более 100 000 объектов? (С #) - PullRequest
2 голосов
/ 01 июня 2010

Я пишу медиаплеер для энтузиастов с большими коллекциями (более 100 000 треков), и одна из моих главных целей - скорость поиска. Я хотел бы разрешить пользователю выполнять поиск в Google по всей своей музыкальной коллекции на основе следующих факторов:

  • Путь к песне и имя файла
  • Элементы в теге ID3 (название, исполнитель, альбом и т. Д.)
  • Текст

Каков наилучший способ хранения этих данных и их поиска? В настоящее время я храню каждую дорожку в объекте и перебираю массив этих объектов, проверяя каждую из их переменных на соответствие строк на основе заданного поискового текста.

Я столкнулся с проблемами, когда мой поиск неэффективен, потому что это всегда поиск по фразе, и я не уверен, как сделать его более размытым. Внутренняя БД, такая как SQLlite, будет быстрее, чем эта? Любые идеи о том, как я должен структурировать эту систему?

Мне также необходимо сохранение списка воспроизведения, чтобы при закрытии приложения и открытии приложения тот же список воспроизведения загружался немедленно. Как сохранить информацию о плейлисте, чтобы он мог быстро загружаться при запуске приложения? В настоящее время я выполняю кодирование в JSON всего плейлиста, сохраняю его в текстовом файле и считываю в ListView во время выполнения, но он становится медленным на 20 000 треков.

Спасибо!

Ответы [ 4 ]

8 голосов
/ 01 июня 2010

SQLite должен нормально с этим работать. Для расширенной функциональности поиска вы можете взглянуть на Lucene.NET. Что касается ваших больших списков воспроизведения, они также должны храниться в БД и загружать их с подкачкой страниц (т.е. 50 дорожек за раз).

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

Несколько предложений:

  1. Не считывать файл в ListView. Используйте шаблон MVVM и считайте файл в коллекцию, позволяя привязке данных заполнить ListView.

  2. Включить виртуализацию в ListView.

  3. Загружать данные в отдельном потоке. Таким образом, пользовательский интерфейс будет реагировать на загрузку элементов.

  4. Линейный поиск в оперативной памяти обычно подходит только для 100 000 элементов. Создавайте индексы только там, где это необходимо.

  5. В вашей модели представления сохраните весь список дорожек в одном поле и отфильтрованный в данный момент список дорожек в другом поле. Когда фильтр изменится, вычислите новый отфильтрованный список и установите для свойства новое значение, а не вносите изменения в существующую отфильтрованную коллекцию. Не используйте CollectionView для фильтрации.

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

  7. Для поиска попробуйте разбить заголовки на слова и искать любые / все слова вместо точных фраз.

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

Я создал многозонный музыкальный проигрыватель, который обрабатывает большие музыкальные коллекции. Подход, который я выбрал, заключался в создании таблицы тегов и ассоциации Song-Tag. У меня есть различные типы тегов, TagArtist, TagAlbum, TagGenre, TagWord, ... которые все происходят от Tag.

Использование Entity Framework 4 Я могу эффективно запросить любое слово, жанр, название, исполнителя и получить все песни, содержащие это слово. Я могу запросить либо «любое слово в любом месте в исполнителе, названии, жанре, ...», либо по определенному типу тега, например, Исполнитель начинается с 'X'.

Для обработки случайных списков воспроизведения я также храню случайное число с каждой песней в базе данных. Упорядоченный случайный результат может быть получен с помощью XOR сегодняшнего случайного числа с номером в базе данных (операция, которую вы можете выполнить в базе данных).

Используя LINQ to EF, вам никогда не нужно хранить весь плейлист в памяти, вы используете Skip () и Take () для перехода к нужной «странице» или отдельной песне.

Моя система также отвечает на запросы на естественном языке, такие как «Воспроизвести песни, добавленные на прошлой неделе» или «Воспроизвести исполнителя: Фил», или просто «Играть X». Смотрите демо в блоге.

Я считаю, что это также первый музыкальный проигрыватель, который не воспроизводит сезонную музыку в неподходящее время года!

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

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

Для сохранения вашего плейлиста, поскольку вы уже используете JSON, посмотрите MongoDB . Это довольно классная база данных NoSQL, которая звучит так, как будто бы она идеально подходит для ваших нужд, и есть драйверы .NET, которые легко добавить в приложения .NET.

Приветствие.

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