2010-02-23 453 views
4

我正在創建一個緩存,它將包含Delphi 2007中的記錄。Delphi中的高效緩存

每條記錄​​包含一個字符串,2個日期和一個值。

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

無法保證緩存的最大大小。

很有可能該位置在不同日期有多個條目
只有13個位置。

緩存需要被搜索,並將在性能關鍵的地方。

我正在考慮爲這個結構創建一個2維數組,並將排序的字符串列表作爲索引。所以當我搜索時,我將訪問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; 

的位置將在字符串列表。

這是一個高效的緩存結構嗎?

+0

你是從幾個線程還是隻訪問一個TStringList?如果您正在從多個線程訪問列表,您將需要某種鎖定機制(關鍵部分)來控制誰可以更改列表。讀取可以通過多個線程同時完成 – 2010-02-23 13:50:52

+0

只是主線程。 – 2010-02-23 14:12:06

+2

你可以重命名這個問題嗎?這不是關於搜索動態數組 - 更關於搜索緩存或如何使用數據緩存。一個好的問題名稱有助於人們尋找解決某個特定問題/主題的方法。 – 2010-02-24 01:31:25

回答

4

您的結構足夠高效緩存,但我不會在性能關鍵的地方使用它。如果您的緩存增長,並且您在一個位置上有5000個項目,那麼您仍然通過5000個項目進行線性搜索。

我認爲最好是對列表進行排序並使用二分搜索來搜索緩存中的項目。

如果我要實現這樣的事情,我會帶一個帶指針的TList來記錄。該列表將比使用TList.Sort進行排序,我根據記錄包含的數據給出一個對列表進行排序的過程。分選將在選擇性最高的田地上進行,然後在選擇性第二高的田地上進行,等等。

如果您想要查找條目,請在列表中執行二分搜索,如果值不存在,您可以從數據庫中獲取值並將其添加到緩存中。

當然,這將全部很好地包裝在一個處理這個和內存分配問題的類中。

散列表也是可能的,但你必須做測試,看看哪個更快。

+0

這與我使用的實現最爲接近:我將StringList保留爲索引(對其進行排序,以便它執行它自己的二進制搜索),但用TLF自定義排序例程和二進制搜索替換了數組的第二維數組。還保存了一個布爾數組,所以只有在自上一次添加新項目後纔對列表進行排序。 – 2010-02-23 18:10:01

+0

添加新項目時,您不必保留布爾值來對列表進行排序。使用二分查找算法找到要添加的項目的索引並將其插入。看看如何在已排序的TStringList中實現添加字符串。你的列表將總是按照那樣排序。 – 2010-03-17 07:55:12

1

你的想法看起來很合理,應該有效地工作。實質上,你將實現一個帶有索引的簡單數據庫表。它將索引信息從數據中分離出來,以便更新索引的成本相對於在已​​排序結構中移動的數據「相對較小」。

另一種可能性是使用內存數據庫。德爾福有許多可用的。他們會爲你做很多事情,並可能提供更大的靈活性。

0

如果性能是一個問題,儘可能避免字符串比較。我會將緩存數組按照您想要的任何搜索順序排序,然後對原始數據執行二進制搜索。

如果字符串值最重要,則使用類似soundex算法的字符串將字符串拆分爲單個字符和數字,並將其編碼爲單詞或整數(簡單哈希)。按位置字符串排序數組。這樣你的不執行字符串匹配明顯的不匹配。