1

私は 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 つまでです。

4

1 に答える 1

0

タスク マネージャーによって報告される RAM 使用量は、プロセスの実際のワーキング セットとは密接に関連していません。メモリ管理は複数のレベルで処理されることに注意してください。OS は大きなメモリ チャンクをプロセスのヒープに配信します。この場合、Python ランタイムは大量のメモリを OS に返すことなく、プロセス ヒープから割り当てて解放します (異常な状況を除く)。

shelve モジュールはおそらく、データをディスクに書き込む前に、メモリ内のシェルブされたバージョンのデータの少なくとも一部を構成するため、最初の増加が説明されます。

読み取りと書き込みを繰り返しても、使用中のメモリの総量が増加せず、現在行っていることを実行するのに十分なメモリがある場合は、ここで心配する必要はありません。

于 2012-04-02T23:16:59.233 に答える