2014-11-29 4 views
0

을 차지합니다. 이 문제를 해결할 방법이 있습니까? 이 상태 목록이 필요하므로 새 상태를 생성 할 때 목록에서 해당 값을 업데이트 할 수 있습니다.파이썬 목록이 너무 많은 메모리

편집 : 이 상태를 4x4 격자에 저장합니다. 여기서 0, 1 및 2는 격자의 각 사각형의 가능한 상태입니다. 저장된 값은 실제로 현재 상태에서 그리드의 사각형으로 이동하기위한 보상이 무엇인지 나타내는 16 길이 목록입니다. 불가능한 동작은 -np.inf로 표시됩니다. 게임이 진행됨에 따라 특정 주에서 승리로 이끄는 이동에 대한 보상이 늘어나므로 봇이 향후 이동을 할 가능성이 큽니다.

예 : tic-tac-toe의 단순화 된 예입니다.

x| |o 
| | 
o| | 

이 상태

은 '102000200', 9 길이리스트로 번역 될 것이며,이 모든 가능한 상태의 목록에서 조회 할 줄 때 다음 최고의 이동이 무엇인지 볼 수 있습니다. 이 경우 x의 중간 지점이됩니다.

+0

문제를보다 명확하게 설명하십시오. 어떤 상태? 어떤 가치를 업데이트합니까? – simonzack

+0

그건 ~ 4 천 3 백만 주입니다. 스파 스 표현을 사용할 수 없습니까? 예 : 사전 (또는'defaultdict'), 여기서 각 키는 문자열 (또는 단지 문자열, 또는 그 문자열이 밑줄 3의 숫자라고 가정하여 만든 정수)의 튜플이 될 것입니까? – jonrsharpe

+0

조금 더 자세한 정보로 업데이트되었습니다. 나는 사전이 공간을 절약 할 수 있을지 모르겠다. 여전히 많은 값을 저장하지 않을 것이다. – Alxander

답변

2

저는 이것을 Python 3.4 (64 비트)에서 테스트했습니다.

결과 목록은 큰하지만, 엄청난 수 없습니다 (또는 그렇게 보인다) :

>>> import itertools, sys 
>>> states = itertools.product("012",repeat = 16) 
>>> s = list(states) 
>>> sys.getsizeof(s) 
357571088 

그리고 문자열 목록이 될 것이라고 내 초기 추측은 작은 잘못는 -을 많이하지 않았다 차.

그러나, 나는 gc.collect() 그래서이 것을이 표시되지 후, del(s) 후 파이썬의 메모리 사용 list에 대한 호출 후 약 8 기가 바이트 (출시 후) 4메가바이트에서 증가하고, 그것은 단지 기본 상태로 돌아갑니다 것을 볼 수 있습니다 그러한 대규모, 다중 요소 목록과 관련된 엄청난 오버 헤드입니다. Alex Martelli가 here이라고 묘사 한 것과 관련이있을 수 있습니다.이 경우 Python 솔루션은 상당히 복잡해집니다.

아마도이 문제에 대한 다른 접근 방법에 대해 생각해 봐야 할 것입니다. 모든 상태를 저장할 필요는 없습니다. 목록의 항목 번호 123456을 계산하는 것은 쉽습니다. 따라서 프로그램 실행 중에 수정 된 항목 만 저장하면됩니다.

+0

실제로 생성 된 상태 만 저장하는 접근 방식을 고려해 봤지만 알고리즘은 로봇의 미래 이동 예측을 사용합니다. 미래의 이동은 이미 초기화 된 값이 없으면 예측할 수 없습니다. – Alxander

2

itertools.product은 반복자를 반환합니다. 목록으로 변환하는 것은 많은 메모리를 사용하는 단계입니다. 제품을 저장하지 않고 제품을 반복하는 알고리즘을 작성할 수 있습니까? like

for tuple16 in itertools.product("012", repeat = 16): 
    do_something(tuple16) 
+0

불행히도, 나는 룩업 테이블이 필요합니다. – Alxander

관련 문제