私は Python の shelve モジュールを使い始めました (そして、私は Python 自体に慣れていません)。情報を完全に保存およびロードしている間、RAM の使用量は... 奇妙です。
保存したい部分は、別のマップの特定の座標にあるマップと、特定の座標に存在する場合と存在しない場合がある「fov1」や「fov2」などの値の選択です。たとえば、x=50 および y=100 の「ミニマップ」では、別のマップが存在する可能性があり、その保存が必要です。Minimap[50][100] には、たとえば、fov0 と fov1 のリストがある場合もありますが、それ以外はありません。最大視野値は 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()
一方、これは load 関数です。これは、マップとすべての視野を表示し、それらを元に戻すことを目的としています。繰り返しますが、これは完全に機能します。
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の使用量が奇妙になります。単一のマップを保存するだけで、実際に Python が使用している RAM が増加します! さすがにそれはあり得ませんよね?または、大きなチャンクを一度に保存すると、RAM は当然ダウンしますが、それらをすべてバックアップすると、保存前よりも RAM が大幅に増加します。その後、再度保存/ロードしても、RAM は増加しません。最初の保存/読み込みサイクルでのみ増加し、その後は増加しません。私は一日中これに取り組んできましたが、この奇妙さの原因と解決方法がわかりません. 誰でも私を助けることができますか?
編集:ああ、はい、Python 2.7.2を使用しています。また、一度に保存する必要があるマップは 9 つまでです。