파이썬의 쉘브 모듈을 사용하기 시작했습니다. (그리고 저는 파이썬 자체에 새로운 것입니다.) 정보를 완벽하게 저장하고로드하는 동안 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 개지도 만 저장할 필요가 없습니다.
프로그램이 실제로 RAM을 모두 먹지 않는 한, 사용량의 변동에주의를 기울이지 않을 것입니다. 그런 종류의 제어가 정말로 필요한 경우에는 파이썬으로 작성하면 안됩니다! 그러나 내가 염려할만한 것은 각각의 y와 x에 대해 76 p 값을 반복하는 방법입니다 (잠재적으로 3,040,000 개의 서로 다른 검사입니다!). minimap [x] [y]가 유효한 p 값의 사전을 반환하므로 유효한 값을 반복 할 수 있습니다. 당신이하려는 일에 대해 더 많은 정보를 게시 할 수 있다면 나는 더 많은 도움이 될 수 있습니다. –
아, 그건 문제가 아닙니다. 한 번에 3x3 크기의지도 그리드를 저장할 필요가 없으므로 대부분의 경우 (매우 드물게) 684 개의 체크를 의미합니다!기본적으로 게임용지도입니다.이지도는 총 40,000 x 40,000 개의 타일이 200x200 세트의 200x200 타일로 나뉘어져 있습니다. 미니 맵은 세계지도의 일종으로, 각 맵, 즉 minimap [x] [y] .map은 200x200 덩어리입니다. 두 개의 덩어리를지도에서 멀리 떨어 뜨리면 해당 섹션과 그 모든 항목이 언로드됩니다 (잘하면!). 그런 다음 뒤로 이동하면로드됩니다. – UltimaRatioRegum