2013-10-05 28 views
1

我厌倦了使用PyMC重新运行长MCMC链,因此使用链节省功能PyMC带有听起来像一个好主意。我正在使用pickle数据库后端来感受基于磁盘保存的MCMC工作流程,并且我发现如果我尝试从连续两次使用pickle数据库的PyMC MCMC模型中进行抽样,则会调用第二个sample非常慢PyMC:初始采样运行后,采用pickle数据库的MCMC采样速度令人难以置信

from pymc import MCMC 
from pymc.examples import disaster_model 

dbname = 'simple.pickle' 

S = MCMC(disaster_model, db='pickle', dbname=dbname) 

S.sample(1e4) # <-- Runs very fast 
if True: 
    S.sample(1e4) # <-- *very slow* 

S.db.close() 

第一sample调用完成几乎是瞬间,但第二个过程非常吞吞吐吐,服用几秒钟即可完成。同时,我在第二次调用sample期间查看磁盘上的simple.pickle文件,并注意到它的大小在20到60兆之间迅速波动。

我希望第二个(以及所有后续的)调用在大约与第一个相同的时间完成,这样我就可以手动监控链条的混合属性(是的,我知道有各种各样的fancier诊断,我可以使用,但除此之外)。

我在做什么错?

PyMC 2.2版,Python 2.7.3,Ubuntu 12.10 64位。

回答

1

你可以试试GitHub上的master branch?有一个数据库后端修复那里可能是这个原因。我们几乎已经发布了2.3版本,但在此之前,您可以从GitHub构建。

+0

易于从源代码构建,并且多个'sample'调用现在按预期完成。 'len(S.trace('early_mean',chain = None)[:])##> 20000' ---太棒了。 –