繁体   English   中英

Delphi中的高效缓存

[英]An efficient cache in Delphi

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

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

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

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

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

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

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

就像是

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

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

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

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

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

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

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

当然,这将很好地包含在一个处理这个和内存分配问题的类中。

也可以使用散列映射,但您必须进行测试以查看哪个更快。

你的想法听起来很健全,应该有效率。 实质上,您将使用索引实现一个简单的数据库表。 它将索引信息与数据分开,以便相对于在排序结构中移动数据,更新索引的成本“小”。

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

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

如果字符串值最重要,那么使用类似soundex算法的东西将字符串拆分为单个字符和数字,并将它们编码为单词或整数(简单哈希)。 按此排序数组以及按位置字符串排序的任何碰撞。 这样你的不执行字符串匹配明显的不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM