【问题标题】:Effective Method to Manage and Search Through 100,000+ Objects Instantly? (C#)即时管理和搜索 100,000 多个对象的有效方法? (C#)
【发布时间】:2011-02-26 04:07:51
【问题描述】:

我正在为拥有大量收藏(超过 100,000 首曲目)的爱好者编写一个媒体播放器,我的主要目标之一是搜索速度。我希望允许用户根据以下因素对他们的整个音乐收藏进行类似 Google 的搜索:

  • 歌曲路径和文件名
  • ID3 标签中的项目(标题、艺术家、专辑等)
  • 歌词

对我来说存储这些数据并进行搜索的最佳方式是什么?目前,我将每个轨道存储在一个对象中,并遍历这些对象的数组,根据给定的搜索文本检查它们的每个变量是否匹配字符串。

虽然我的搜索无效,但我遇到了一些问题,因为它始终是短语搜索,我不知道如何使它更模糊。像 SQLlite 这样的内部数据库会比这更快吗?关于我应该如何构建这个系统的任何想法?

我还需要播放列表持久性,以便当他们关闭应用程序并打开应用程序时,他们的相同播放列表会立即加载。我应该如何存储播放列表信息,以便在应用程序启动时快速加载?目前我正在对整个播放列表进行 JSON 编码,将其存储在文本文件中,并在运行时将其读入 ListView,但超过 20,000 首曲目变得缓慢。

谢谢!

【问题讨论】:

  • SQLLite 听起来很合适。
  • 如果你所做的一切都围绕着对象,你可以查看一个对象数据库——这样你就可以跳过 JSON 读取。那里有很多,但我没有足够的经验来推荐。大多数(但不是全部)都是商业产品。

标签: c# wpf visual-studio search full-text-search


【解决方案1】:

SQLite 应该可以正常工作。对于扩展搜索功能,您可以查看 Lucene.NET。关于您的大型播放列表,这些也应该存储在数据库中,并通过分页加载它们(即一次 50 首曲目)。

【讨论】:

    【解决方案2】:

    几个建议:

    1. 不要将文件读入 ListView。使用 MVVM 模式并将文件读入集合,让数据绑定填充 ListView。

    2. 在 ListView 上启用虚拟化。

    3. 在单独的线程中加载数据。这样,UI 将在项目加载时做出响应。

    4. RAM 中的线性搜索通常只适用于 100,000 个项目。仅在必要时构建索引。

    5. 在您的视图模型中,将整个轨道列表存储在一个字段中,并将当前过滤的轨道列表存储在另一个字段中。当过滤器更改时,计算一个新的过滤列表并将属性设置为新值,而不是更改现有的过滤集合。不要使用 CollectionView 进行过滤。

    6. 也许可以考虑使用比 json 更有效的数据格式。用特殊字符替换逗号的 CSV 变体往往非常快速且向后兼容。

    7. 对于搜索,请考虑将标题分解为单词并搜索任何/所有单词而不是确切的短语。

    【讨论】:

      【解决方案3】:

      查看Lucene.NET 以获得一个非常好的全文搜索引擎,您可以在应用程序中轻松使用它。它是开源的,易于使用,并且有很多社区支持。

      对于您的播放列表持久性,由于您已经在使用 JSON,请查看 MongoDB。这是一个非常酷的 NoSQL 数据库,听起来非常适合您的需求,并且有 .NET 驱动程序可以轻松添加到 .NET 应用程序中。

      干杯。

      【讨论】:

        【解决方案4】:

        我已经构建了一个多区域音乐播放器,可以处理大量音乐收藏。我采用的方法是创建一个标签表和一个关联 Song-Tag。我有各种 Tag 类型,TagArtist、TagAlbum、TagGenre、TagWord 等,它们都派生自 Tag。

        使用 Entity Framework 4,我可以有效地查询任何单词、流派、标题、艺术家,并获取包含该单词的所有歌曲。我可以通过“艺术家、标题、流派……中的任何单词”或特定的标签类型进行查询,例如艺术家以“X”开头。

        为了处理随机播放列表,我还在数据库中为每首歌曲存储了一个随机数。将今天的随机数与数据库中的数字进行异或,可以得到有序的随机结果(可以在数据库中进行的操作)。

        使用 LINQ to EF,您无需将整个播放列表保存在内存中,您可以使用 Skip() 和 Take() 找到正确的“页面”或单个歌曲。

        我的系统还会响应自然语言查询,例如“播放上周添加的歌曲”或“播放艺术家:Phil”,或者只是“播放 X”。请参阅博客上的演示。

        我相信它也是第一款不会在错误季节播放季节性音乐的音乐播放器!

        【讨论】:

        • 嗨,Hightechrider,你的项目是开源的吗?我在你的博客上找不到播放器
        • 目前未开放,我正在考虑。播放器是家庭自动化系统的一部分,那里有一个展示整个界面的演示。
        猜你喜欢
        • 1970-01-01
        • 2018-10-21
        • 2011-06-06
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多