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

Delphi中的高效缓存

  •  4
  • James  · 技术社区  · 16 年前

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

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

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

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

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

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

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

    类似的东西

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

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

    这是否是用于缓存的有效结构?

    3 回复  |  直到 16 年前
        1
  •  4
  •   The_Fox    16 年前

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

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

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

    如果您想找到一个条目,您可以在列表中执行二进制搜索并获取该值,如果该值不存在,则可以从数据库中获取该值并将其添加到缓存中。

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

    哈希图也是可能的,但是你必须做一些测试来看看哪个更快。

        2
  •  1
  •   Mark Wilkins    16 年前

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

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

        3
  •  0
  •   skamradt    16 年前

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

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