2011-10-03 150 views
4

在我的劇本,我讀了套接字消息,並根據在消息中的內容改變一些內存對象的狀態。一切正常。如何及時跟蹤對象狀態?

但我想要實現非活動對象的缺失:例如,如果有在一段時間內對指定對象沒有消息,它應該被刪除。什麼是最好的方式來做到這一點?

回答

4

這一條可能不適合你的工作,但: 如果您能夠接受在指定時間後不刪除對象,但只保留對象的指定,Python的3.2有functools.lru_cache正是出於這個。

+2

+1限制對象的數量實際上可能是一個更好的選擇:它使內存使用率較低,如果大量的對象,在繁忙peroids被訪問,並且不刪除對象時根本沒有一個短期的任何請求。 – delnan

+0

Python 3.2的要求可能是一個更強的原因。 (雖然它很可能從Python 3中的[functools(http://hg.python.org/cpython/file/default/Lib/functools.py#l123)適應。) –

1

商店中的每個對象的時間戳 - 當你修改更新時間戳當前時間。

然後有運行每隔一段時間,着眼於所有的對象,並早於一定量的時間戳在當前時間之前刪除任何東西。

1

如果您遇到了Python 2,或者您需要基於時間戳並且Amber的答案不夠快,您可以對Python 3的lru_cache做些什麼變化,但是需要修改對象的修改時間考慮到:

(我沒有測試這一點;希望的錯誤是輕微的,思路是清晰的。)在OrderedDict


存儲中的對象(有一個package的蟒蛇比2.7以上) 。

import collections 
objects = collections.OrderedDict() 

我假設你有每個對象的一些關鍵,所以你可以在流中標識它們。做一個常規查找的變體,從字典中刪除並重新插入一個已經存在的對象。這將保持OrderedDict按上次訪問進行排序。

try: 
    obj = objects.pop(the_key) 
except KeyError: 
    obj = create_new_object(the_key) 
objects[the_key] = obj 
obj.timestamp = current_time() 

然後,每過一段時間(或每次),刪除舊的對象。該LRU變種(限制對象的數量)是很容易的:

while len(objects) > some_threshold: 
    objects.popitem(last=False) 

基於時間戳的變種是一個有點棘手,但數量不多。最古老的作品在前面,所以我們只需要看第一個,如果它太古老就彈出它。

while objects: 
    obj = objects.itervalues().next() # Python 2 only :(
    if obj.timestamp < some_threshold(): 
     objects.popitem(last=False) 
    else: 
     break 

眼球分析說,這給你攤銷O(1)訪問,和O兩種變體(數量拋棄的物體)保養。