學習mysql資料庫時,了解了一下ib_buffer_pool的儲存機制,使用lru演算法施行將少用的資料淘汰,儲存使用更頻繁的資料。
再基於3.6版本python的字典資料型別改變,想試試新字典預設有序的話能否直接使用於lru演算法。
from collections import ordereddict
class
lrulru_dict()
:def
__init__
(self, capacity)
:# 傳入快取容量
self.capacity = capacity
# 新建字典
self.lru_dict =
# 定義查詢資料的函式
defget
(self, key)
:# 當key不在字典中時
if key not
in self.lru_dict:
return
none
else
:# 把資料先刪再賦值,使其新增到entries陣列末尾
self.lru_dict[key]
= self.lru_dict.pop(key)
# 定義新增資料的函式
defset
(self, key, value)
:# 當key在字典中時重複上述操作
if key in self.lru_dict:
# 刪掉老資料
self.lru_dict.pop(key)
# 存入新值
self.lru_dict[key]
= value
else
:# 當快取滿了的時候
iflen
(self.lru_dict)
== self.capacity:
# 這裡如果繼續使用字典結構dict.popitem實行的是末尾淘汰,不能申明last欄位
# 只能呼叫ordereddict強轉再操作
self.lru_dict = ordereddict(self.lru_dict)
self.lru_dict.popitem(last=
false
)# 新增新值
self.lru_dict[key]
= value
c = lrulru_dict(5)
for i in
range(5
,10):
c.set(i,
10* i)
print
(c.lru_dict, c.lru_dict.keys())
c.get(5)
c.get(7)
print
(c.lru_dict, c.lru_dict.keys())
c.set(10
,100
)print
(c.lru_dict, c.lru_dict.keys())
c.set(9
,44)print
(c.lru_dict, c.lru_dict.keys())
>>
>
dict_keys([5
,6,7
,8,9
])>>
>
dict_keys([6
,8,9
,5,7
])>>
> ordereddict([(
8,80)
,(9,
90),(
5,50)
,(7,
70),(
10,100)
]) odict_keys([8
,9,5
,7,10
])>>
> ordereddict([(
8,80)
,(5,
50),(
7,70)
,(10,
100),(
9,44)
]) odict_keys([8
,5,7
,10,9
])
所以仍需使用orderdict物件才能指定剔除使用最少的陣列頭部資料。 LRU演算法實現
jdk 中的實現 在jdk 中linkedhashmap 可以作為lru 演算法以及插入順序的實現,linkedhashmap 繼承自hashmap 底層結合hash 表和雙向鍊錶,元素的插入和查詢等操作通過計算hash 值找到其陣列位置,在做插入或則查詢操作是,將元素插入到鍊錶的表頭 當然得先刪除...
LRU演算法的實現
0 推薦 lru演算法的實現 什麼是lru演算法lru是least recently used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的.關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向.而記憶體的虛擬儲存管理,是現在最通用,最成...
簡單實現演算法LRU
lru的主要思想基本是,設定乙個固定大小的容器,不斷新增元素。當容器放滿時,把最前面的元素清除,在對尾新增新元素,如果元素是重複的元素,則找出那個元素放到隊尾。lru演算法主要步驟是 1.判斷新元素的key是否在lru中,如果在,就把此元素找出來然後拿到鍊錶尾部 2.判斷元素是否填滿到指定大小,如果...