4

Python で MCMC の明らかに単純なコードに従うと、pickle バックエンドを使用しているにもかかわらず、膨大なメモリ使用量 (>15GB) が発生します。これは、pymc で観測変数の配列を使用するたびに発生します。なぜこれが起こっているのかについて何か考えはありますか?

import pymc as pymc
import numpy as np

N = 17
numC = 5

A = np.zeros([N,N])
A[0:numC, :] = 1
A[:, 0:numC] = 1

C = pymc.Beta('C', alpha=0.5, beta=0.5, size=N)

@pymc.deterministic(dtype=float)
def q(_C=C):
    Q = np.zeros([N,N])
    for i in range(0,N-1):
        for j in range(i+1, N):
            Q[i, j] = Q[j, i] = C[i] + C[j] - C[i]*C[j]

    return Q

obs = []
for i in range(0,N-1):
    for j in range(i+1, N):
        o = pymc.Bernoulli('A%d%d'%(i,j), p=q[i,j], value=A[i,j], observed=True)
        obs.append(o)

model = pymc.Model([C, q] + obs)

mcmc = pymc.MCMC(model, db='pickle', dbname='abc.pickle')
mcmc.sample(10000, burn=5000, thin=5)
mcmc.db.close()
4

1 に答える 1

0
  1. 個人的な経験から、pickle は大きなオブジェクトを使用するとメモリ内で非常に太くなる可能性があり、私が見たように、通常はメモリを解放せずに膨張して成長します。
  2. メモリ プロファイラーを使用して、メモリの増加が発生する場所を確認できます。これにより、実行中に増加するメモリのプロットされたグラフを表示する方法で関数を装飾できます。
于 2015-07-23T17:01:44.413 に答える