代码之家  ›  专栏  ›  技术社区  ›  Amsakanna

搜索和过滤观测数据的有效方法是什么?

  •  2
  • Amsakanna  · 技术社区  · 14 年前

    我有一个大约100万条记录的数据库。我的应用程序经常对这些记录进行增量搜索,并过滤用户界面列表。这种情况更像是“电话联系搜索”。
    目前我正在关注:

    1. 将数据加载到 List<myModel> 在数据源层中`
    2. 发送到MainViewModel
    3. 负载 列出<MyModel> 进入之内 ObservableCollection<myViewModel> (绑定到ListView)
    4. 根据关键字筛选“ObservableCollection”
    5. 当应用程序关闭时,更新数据库[因为 可观察的收集也可能是 由用户更新]

    我的问题:

    • 这是有效的方法吗?
    • 现在我的应用程序消耗了大约30到50 MB的内存。公平吗?
    • 还是应该在数据库中执行搜索?[但我不能在速度上妥协]
    • 我应该始终创建一个我的模型列表并将其加载到我的ObservableCollection中吗?
    • 还建议我过滤技术,它非常适合 增量搜索 (第4点)。目前,我在后面有一个泛型列表,其中包含要查找的整个集合,并将筛选的项添加到ObservableCollection,清除所有以前的项。

    编辑:以前我只检查了37K条记录的内存消耗。使用25万条记录,内存消耗超过100 MB:。因此,现在我计划在内存中只保留大约10万条记录,如果超过了这一点,我将查询数据库。有什么建议吗?

    事先谢谢, 转向器

    1 回复  |  直到 14 年前
        1
  •  2
  •   Johannes Rudolph    14 年前

    有几件事你可以做,而不干扰用户的工作流程或采取一个巨大的性能冲击。

    现在我的敷贴要花大约 30到50 MB的内存。公平吗?

    对于.NET应用程序来说,这是正常的。启动应用程序后,您将直接注意到内存占用并不大。

    或者我应该在 改为数据库?[但我不能 速度妥协]

    只有在第一步无法加载数据时,才能重复查询数据库。每当用户键入框中时,您希望确保不会在每次更改搜索条件时查询数据库,而是在其中有一个短计时器,该计时器在使用新条件查询数据库之前等待一秒钟左右。当请求数据库时,当用户开始滚动时,它还可以帮助减少通过分页或延迟加载剩余数据显示的记录数。正确的数据库索引将帮助您显著降低此类查询的执行速度。

    但是,如果您可以将整个列表保存在内存中(比如说它不太大,一步就无法从数据库中查询它,或者您无论如何都需要向用户显示整个列表),那么最好保留列表的原始副本,并拥有可以递增筛选的列表副本。因此,您需要检查您的搜索条件是否是先前搜索条件的子集。如果是这样,您可以过滤已经过滤的列表,否则您需要过滤原始列表。这可以使用LINQ有效地实现 .Where() 操作员,必要时使用plinq进行parralelize。 。其中() 展品O(N)时间阿法克。

    这可以通过使用具有适当密钥的哈希集来改进。