2012-04-02 4 views
1

파이썬의 쉘브 모듈을 사용하기 시작했습니다. (그리고 저는 파이썬 자체에 새로운 것입니다.) 정보를 완벽하게 저장하고로드하는 동안 RAM 사용량은 ... 이상한.Python shelve; 로드/저장시 예기치 않은 RAM 사용량

저장하려는 부분은 다른지도의 특정 좌표에있는지도와 특정 좌표에 대해 존재할 수도 있고 존재하지 않을 수도있는 'fov1'및 'fov2'와 같은 값을 선택할 수 있습니다. 예를 들어, x = 50 및 y = 100의 "미니 맵"에는 다른지도가있을 수 있으며 그 저장을 원합니다. Minimap [50] [100]은 예를 들어 fov0과 fov1에 대한 목록을 가질 수 있지만 다른 것은 없습니다. 최대 fov 값은 fov75입니다.

내 저장/불러 오기 기능은 다음과 같습니다.

이 저장 기능은 Xcoord + 'x'+ Ycoord (예 : '50x100')로지도를 저장하고 fov를 저장하기 위해 저장해야하는지도 (비어 있지 않고 현재 저장되지 않은지도) Xcoord + 'x'+ Ycoord + 'f'+ fov의 번호 (예 : '50x100f2'). 그건 모두 잘 작동합니다. 또한 그 시점에서 RAM에 보관중인지도를 삭제하고 메모리가 해제 될 수 있도록 존재하는 모든 fov 세그먼트를 삭제하기를 원합니다. 그것은 또한 작동하는 것처럼 보입니다.

def save_maps(): 
file = shelve.open(savename, 'w') 
for x in range(200): 
    for y in range(200): 
     if minimap[x][y].map is not 'blank' and minimap[x][y].map is not 'saved': 
      mapname = str(x) + 'x' + str(y) 
      file[mapname] = minimap[x][y].map 
      minimap[x][y].map = 'saved' 
      for p in range(76): 
       try: 
        fov = getattr(minimap[x][y], 'fov' + str(p)) 
        fovname = str(x) + 'x' + str(y) + 'f' + str(p) 
        file[fovname] = fov 
        delattr(minimap[x][y], 'fov' + str(p)) 
       except: 
        pass 
file.close() 

한편, 여기지도, 모든 영상 범위를 불러와 다시 넣어 의미 부하 기능입니다. 다시 말하지만,이 완벽하게 작동합니다.

def load_map(x, y): 
file = shelve.open(savename, 'w') 
mapname = str(x) + 'x' + str(y) 
minimap[x][y].map = file[mapname] 
for p in range(76): 
    try: 
     fovname = str(x) + 'x' + str(y) + 'f' + str(p) 
     setattr(minimap[x][y], 'fov' + str(p), file[fovname]) 
    except: 
     pass 
file.close() 

그러나 내가 테스트 할 때 작업 관리자를보고 있었기 때문에 이상하게는 RAM 사용이 있습니다. 단순히 하나의 맵을 저장하면 실제로 파이썬이 사용하는 RAM이 증가합니다! 확실하게 그것은 맞을 수 없다? 또는 큰 덩어리를 한 번에 저장하면 RAM이 정상적으로 작동하지만, 모두 다시로드하면 RAM이 이전에 저장되었던 것보다 훨씬 더 높습니다. 그런 다음 다시 저장 /로드하면 RAM이 올라가지 않습니다. 첫 번째 저장 /로드 사이클에서만 증가하고, 다시는 증가하지 않습니다. 나는 하루 종일이 일을 해왔으며이 기이 한 일을 해결할 수 없으며 어떻게 해결 될 수 있는지 알아볼 수 있습니다. 누구든지 나를 도울 수 있습니까?

편집 : 예, Python 2.7.2를 사용합니다. 또한 한 번에 9 개지도 만 저장할 필요가 없습니다.

+0

프로그램이 실제로 RAM을 모두 먹지 않는 한, 사용량의 변동에주의를 기울이지 않을 것입니다. 그런 종류의 제어가 정말로 필요한 경우에는 파이썬으로 작성하면 안됩니다! 그러나 내가 염려할만한 것은 각각의 y와 x에 대해 76 p 값을 반복하는 방법입니다 (잠재적으로 3,040,000 개의 서로 다른 검사입니다!). minimap [x] [y]가 유효한 p 값의 사전을 반환하므로 유효한 값을 반복 할 수 있습니다. 당신이하려는 일에 대해 더 많은 정보를 게시 할 수 있다면 나는 더 많은 도움이 될 수 있습니다. –

+0

아, 그건 문제가 아닙니다. 한 번에 3x3 크기의지도 그리드를 저장할 필요가 없으므로 대부분의 경우 (매우 드물게) 684 개의 체크를 의미합니다!기본적으로 게임용지도입니다.이지도는 총 40,000 x 40,000 개의 타일이 200x200 세트의 200x200 타일로 나뉘어져 있습니다. 미니 맵은 세계지도의 일종으로, 각 맵, 즉 minimap [x] [y] .map은 200x200 덩어리입니다. 두 개의 덩어리를지도에서 멀리 떨어 뜨리면 해당 섹션과 그 모든 항목이 언로드됩니다 (잘하면!). 그런 다음 뒤로 이동하면로드됩니다. – UltimaRatioRegum

답변

0

작업 관리자가보고 한 RAM 사용량은 프로세스의 실제 작업 집합과 밀접한 관련이 없습니다. 메모리 관리는 여러 단계에서 처리된다는 점을 명심해야합니다. OS는 많은 양의 메모리를 프로세스의 힙에 전달합니다.이 경우 Python 런타임은 상당한 양의 메모리를 OS에 반환하지 않고 프로세스 힙에서 할당하고 자유롭게 되돌립니다 (예외적 인 경우는 제외).

쉘브 모듈은 디스크에 기록하기 전에 메모리에 보관 된 버전의 데이터를 적어도 부분적으로 구성하므로 초기 증가를 설명합니다.

반복되는 읽기 및 쓰기로 인해 사용중인 총 메모리가 증가하지 않으며 수행중인 작업을 수행 할 수있는 충분한 메모리가있는 경우 여기에 대해 염려 할 사항이 없습니다.

+0

재미 있고 새로운 지식이 있습니다. 현재 상황은 상한선을 초과하는 것처럼 보이지 않지만 시간의 작은 부분은 여전히 ​​진행됩니다. 그러나이 문제는 코드 작성/저장의 순서에 기인 할 수 있으며 자체적으로 살펴볼 필요가 있다고 생각합니다. 일단 내가 한 번 봐서 내일 이것을 갱신 할거야. – UltimaRatioRegum

관련 문제