【问题标题】:What should i do to maintain performance of a mobile app which is using database?我应该怎么做才能保持使用数据库的移动应用程序的性能?
【发布时间】:2015-12-03 12:21:59
【问题描述】:

我正在使用数据库构建应用程序。 我有一个words 表,每次用户输入内容时,这个应用程序都会记录并更新数据库中的单词。

用户输入一个匹配的单词后,frequency 字段将自动增加。

但问题是用户每天输入,我担心搜索性能会随着时间的推移而降低,并且 Int 字段有一天会达到限制(最大限制 Int)。

因此,我将数据库限制为少于 50.000 条记录。 我会在一段时间后删除不常用的记录。

但我不知道如何处理每个单词的frequency Int 字段? 如何在不永远增加字段的情况下准确知道每个单词的频率使用情况?

【问题讨论】:

  • 这个数据库是在设备上还是在服务器上?
  • @DanBracuk 数据库将存储在设备上。这就是为什么我不希望它太大

标签: ios sql performance search scale


【解决方案1】:

我建议您对频率值使用对数刻度。这就是在这种情况下经常做的事情。 See Wikipedia to learn about logarithmic scales.

例如,如果您有一个频率为 15 的单词 MAN,那么您存储在数据库中的值将是 log(15) ~= 1.17609125906。

如果您随后发现 4 个新的 MAN,那么您想在该字段中添加 4 个。您不能直接添加日志值,因为 log(x)+log(y)=log(x*y)。 (See the Logarithm Rules section of this article for more information on log rules.)

相反 -- 假设您使用以 10 为底的对数,您将使用以下公式: 设置频率 = log(10^频率+4)

【讨论】:

  • 通过这种方式,从技术上讲,它只有助于最小化频率数。我可以将频率场更改为浮动,每次我使用一个单词时,我都会将其增加 0.1 或 0.01。它也使该字段变小,但 SQLite 排序 Float 字段比 Int 字段慢。而且,数量还在不断增加。任何按使用百分比计算频率场的算法,我认为在这种情况下可能会更好。
  • 你了解对数刻度的概念吗?
  • 我正在阅读对数刻度。但是,如果我将1.17609125906 数字存储到数据库中,那么使用这个长字符串数字将需要更多时间来排序查询。简单地存储一个整数可以获得最佳的排序性能。
  • 对数刻度的想法行不通。当整数类型溢出时,您的浮点数停止增加。只需尝试计算1e33 + 1
【解决方案2】:

根据单词的长度,频率的几个字节无关紧要。使用无符号的四字节整数,您最多可以数出超过 20 亿个,这远远超过了用户在其整个生命周期中可以输入的字数。

因此可能需要两个或三个字节,但节省的费用可能微不足道。


不管怎样,防止溢出有以下几种方法:

  • 您可以检测到它,然后撤消操作,将所有内容缩小两倍,然后重做。
  • 您可以定期检查所有数字,并在接近限制时进行缩放。
  • 您可以进行如下概率更新。

概率更新

不是简单地将频率每次增加一,而是仅以随着计数器的增长而越来越低的概率来执行此操作。例如,您可以使用1.0 / (oldValue + 1)2 ** -oldValue 的概率进行增量。后者导致对数增长,但与其他答案中的想法不同,它有效。

由于随机性和精度损失,显然有一些缺点,但是当你只关心相对频率时,它应该足够好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多