2011-10-03 6 views
4

내 스크립트에서는 소켓의 메시지를 읽고 메시지의 내용에 따라 메모리에있는 일부 개체의 상태를 변경합니다. 모든 것이 잘 작동합니다.시간에 개체 상태를 추적하는 방법?

하지만 비활성 객체 삭제를 구현하고 싶습니다. 예를 들어 특정 시간 동안 지정된 객체에 대한 메시지가없는 경우 삭제해야합니다. 가장 좋은 방법은 무엇입니까?

답변

4

이 하나가 당신을 위해 작동하지만,하지 않을 수 있습니다 : 당신은 지정된 시간이 지나면 개체를 제거하지만 개체의 지정된 를 유지하지 괜찮다 경우, 파이썬 3.2은 정확히에 대한 functools.lru_cache 있습니다.

+2

+1 실제로 개체 수를 제한하는 것이 훨씬 더 좋은 선택 일 수 있습니다. 바쁜 기간 동안 많은 개체에 액세스하면 메모리 사용량이 낮아지며 잠깐 동안은 요청이 없을 때 개체가 삭제되지 않습니다 . – delnan

+0

Python 3.2 요구 사항은 아마도 더 강한 이유 일 것입니다. (비록 Python 3의 [functools] (http://hg.python.org/cpython/file/default/Lib/functools.py#l123)에서 적응할 수 있습니다.) –

1

각 개체에 타임 스탬프를 저장합니다. 타임 스탬프를 수정할 때마다 현재 시간으로 업데이트하십시오.

그런 다음 모든 항목을 자주보고 모든 개체를보고 현재 시간보다 일정 시간 이전에 타임 스탬프가있는 항목을 제거하십시오.

1

파이썬 2가 붙어 있거나 타임 스탬프 기반이 필요하고 앰버의 대답이 빠르지 않은 경우에는 파이썬 3의 lru_cache가하는 것을 변형 할 수 있지만 객체의 수정 시간 고려 :

는 (나는 이것을 테스트하지 않았다 희망 버그 미성년자와 아이디어가 분명하다.)


저장소 개체를 OrderedDict에 (2.7보다 비단뱀에 대한 package 나이가있다) .

import collections 
objects = collections.OrderedDict() 

난 당신이 스트림을 식별 할 수 있도록 각 개체에 대한 몇 가지 키가 가정합니다. dict에서 이미 존재하는 객체를 제거하고 다시 삽입하는 일반 룩업의 변형을 수행합니다. 이렇게하면 마지막 액세스로 정렬 된 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 

안구 분석

이 당신이 (1) 액세스 O를 상각 제공하고, 두 변종에 O (폐기 객체의 수) 보수 말한다.

관련 문제