我正在创建一个缓存,它将包含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;
因为位置将在字符串列表中。
这是一个用于缓存的高效结构吗?
答案 0 :(得分:4)
您的结构对于缓存非常有效,但我不会在性能关键的地方使用它。如果您的缓存增长,并且您在一个位置上有5000个项目,那么您仍然可以通过5000个项目进行线性搜索。
我认为最好对列表进行排序,并使用二进制搜索来搜索缓存中的项目。
如果我要实现类似的东西,我会将带有指针的TList带到记录中。列表将与TList.Sort一起排序,我给出了一个程序,根据记录包含的数据对列表进行排序。排序将在具有最大“选择性”的字段上进行,然后在具有第二多选择性的字段上进行,依此类推。
如果要查找条目,请在列表中执行二进制搜索并获取值,如果该值不存在,则从数据库中获取该值并将其添加到缓存中。
当然,这将很好地包含在一个处理此问题和内存分配问题的类中。
也可以使用散列图,但是您必须进行测试以查看哪个更快。
答案 1 :(得分:1)
你的想法听起来很健全,应该有效率。实质上,您将使用索引实现一个简单的数据库表。它将索引信息与数据分开,这样相对于在排序结构中移动数据,更新索引的成本“很小”。
另一种可能性是使用内存数据库。 Delphi有很多可用的。他们会为你做很多事情,并可能提供更大的灵活性。
答案 2 :(得分:0)
如果需要考虑性能,请尽可能避免字符串比较。我会将缓存数组排序为您想要的任何搜索顺序,并对原始数据执行二进制搜索。
如果字符串值最重要,那么使用类似soundex算法的字符串将字符串拆分为单个字符和数字,并将它们编码为单词或整数(简单哈希)。按此排序数组以及按位置字符串排序的任何碰撞。这样,你的表演不符合明显的不匹配。