我厌倦了用PyMC重新运行长MCMC链,因此使用链保存功能PyMC带来的声音听起来很棒。我正在使用pickle
数据库后端来了解基于磁盘的保存的MCMC工作流程,我发现如果我尝试连续两次使用pickle数据库从PyMC MCMC模型中进行采样,第二个sample
调用非常慢。
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兆字节之间快速波动。
我希望第二个(和所有后续的)sample
调用在与第一个调用大致相同的时间内完成,这样我就可以手动监控链的混合属性(是的,我知道有各种更高级的诊断功能)我可以使用,但除了问题之外。
我做错了什么?
PyMC版本2.2,Python 2.7.3,Ubuntu 12.10 64位。
答案 0 :(得分:1)
您可以尝试使用GitHub上的master branch进行构建吗?那里有一个数据库后端修复可能是导致这种情况的原因。我们几乎已经发布了2.3版,但在此之前你可以从GitHub构建。