내 스크립트에서는 소켓의 메시지를 읽고 메시지의 내용에 따라 메모리에있는 일부 개체의 상태를 변경합니다. 모든 것이 잘 작동합니다.시간에 개체 상태를 추적하는 방법?
하지만 비활성 객체 삭제를 구현하고 싶습니다. 예를 들어 특정 시간 동안 지정된 객체에 대한 메시지가없는 경우 삭제해야합니다. 가장 좋은 방법은 무엇입니까?
내 스크립트에서는 소켓의 메시지를 읽고 메시지의 내용에 따라 메모리에있는 일부 개체의 상태를 변경합니다. 모든 것이 잘 작동합니다.시간에 개체 상태를 추적하는 방법?
하지만 비활성 객체 삭제를 구현하고 싶습니다. 예를 들어 특정 시간 동안 지정된 객체에 대한 메시지가없는 경우 삭제해야합니다. 가장 좋은 방법은 무엇입니까?
이 하나가 당신을 위해 작동하지만,하지 않을 수 있습니다 : 당신은 지정된 시간이 지나면 개체를 제거하지만 개체의 지정된 수를 유지하지 괜찮다 경우, 파이썬 3.2은 정확히에 대한 functools.lru_cache 있습니다.
각 개체에 타임 스탬프를 저장합니다. 타임 스탬프를 수정할 때마다 현재 시간으로 업데이트하십시오.
그런 다음 모든 항목을 자주보고 모든 개체를보고 현재 시간보다 일정 시간 이전에 타임 스탬프가있는 항목을 제거하십시오.
파이썬 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 (폐기 객체의 수) 보수 말한다.
+1 실제로 개체 수를 제한하는 것이 훨씬 더 좋은 선택 일 수 있습니다. 바쁜 기간 동안 많은 개체에 액세스하면 메모리 사용량이 낮아지며 잠깐 동안은 요청이 없을 때 개체가 삭제되지 않습니다 . – delnan
Python 3.2 요구 사항은 아마도 더 강한 이유 일 것입니다. (비록 Python 3의 [functools] (http://hg.python.org/cpython/file/default/Lib/functools.py#l123)에서 적응할 수 있습니다.) –