【问题标题】:An efficient cache in DelphiDelphi 中的高效缓存
【发布时间】:2011-01-20 01:58:17
【问题描述】:

我正在创建一个缓存,它将包含 Delphi 2007 中的记录。

每条记录包含一个字符串、2 个日期和一个值。

Type MyRecord = Record
    Location : String;
    Date1 : TDateTime;
    Date2 : TDateTime;
    Value : Double;
End;

无法保证缓存的最大大小。

Location 很有可能在不同日期有多个条目
只有 13 个地点。

缓存需要可搜索并且处于性能关键位置。

我正在考虑为这个结构创建一个二维数组,并将排序的字符串列表作为索引。因此,当搜索时,我会访问 Stringlist 以在数组中使用名称值对查找我需要的索引。 (位置 = 索引) 然后我需要遍历每个位置的项目,以查看该值是否在缓存中同时匹配 Date1 和 Date2。如果该值不在缓存中,我需要从数据库中获取它并将其添加到缓存中。

类似的东西

Type MyRecord = Record
    Date1 : TDateTime;
    Date2 : TDateTime;
    Value : Double;
End;
...
Cache: Array[1..13] of Array of MyRecord
Locations: TStringList;

因为位置将在字符串列表中。

这是一种用于缓存的有效结构吗?

【问题讨论】:

  • 您是从多个线程还是仅一个线程访问 TStringList?如果您从多个线程访问列表,您将需要某种锁定机制(关键部分)来控制谁可以更改列表.. 读取可以由多个线程同时完成
  • 能否重命名问题?这并不是真正关于搜索动态数组 - 更多关于搜索缓存或如何使用数据缓存。一个好的问题名称可以帮助人们搜索特定问题/主题的解决方案。

标签: delphi arrays search caching


【解决方案1】:

您的结构对于缓存来说足够高效,但我不会在性能关键的地方使用它。如果您的缓存增长,并且您在一个位置有 5000 个项目,那么您仍在对 5000 个项目进行线性搜索。

我认为最好对列表进行排序并使用二进制搜索来搜索缓存中的项目。

如果我要实现类似的东西,我会使用带有指向记录的指针的 TList。该列表将使用 TList.Sort 进行排序,我给出了一个根据记录包含的数据对列表进行排序的过程。排序将在“选择性”最高的字段上进行,然后在选择性第二高的字段上进行,依此类推。

如果要查找条目,则对列表执行二进制搜索并获取值,如果不存在,则从数据库中获取并将其添加到缓存中。

当然,这一切都会很好地封装在一个类中,该类负责处理这个问题和内存分配问题。

hashmap 也是可能的,但您必须进行测试以查看哪个更快。

【讨论】:

  • 这与我使用的实现最接近:我将 StringList 保留为索引(已排序以便它执行自己的二进制搜索),但将数组的第二维换成了带有自定义的 TList排序例程和二分查找查找。还保留了一个布尔数组,因此它仅在自上次排序后添加了新项目时才对列表进行排序。
  • 添加新项目后,您不必保留布尔值来对列表进行排序。使用二进制搜索算法查找要添加的项目的索引并将其插入其中。看看如何在排序的 TStringList 中实现添加字符串。您的列表将始终如此排序。
【解决方案2】:

您的想法似乎很合理,应该可以有效地发挥作用。本质上,您将实现一个带有索引的简单数据库表。它将索引信息与数据分离,因此更新索引的成本相对于在排序结构中移动数据而言“很小”。

另一种可能性是使用内存数据库。有许多可用于 Delphi。他们会为您做很多事情,并可能提供更大的灵活性。

【讨论】:

    【解决方案3】:

    如果性能是一个问题,请尽可能避免字符串比较。相反,我会将缓存数组排序为您想要的任何搜索顺序,并对原始数据执行二进制搜索。

    如果字符串值最重要,则使用 soundex 算法之类的方法将字符串拆分为单个字符和一个数字,并将两者编码为一个单词或整数(简单哈希)。按此对数组进行排序,并在任何冲突上按位置字符串排序。这样,您就不会针对明显的不匹配项执行字符串匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 2011-10-31
      • 2011-11-11
      • 2010-10-22
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多