我在python中编写了一个程序需要几个小时来计算。我现在希望程序不时保存所有内存(主要是numpy-arrays)。这样我就可以从最后一次保存发生的那一刻开始重新计算。我不是在寻找像'numpy.save(file,arr)'这样的东西,而是一种一次性保存所有内存的方法......
亲切的问候, 的Mattias
答案 0 :(得分:1)
我同意@phyrox,可以使用dill
将您的活动对象保存到磁盘,以便稍后重新启动。 dill
可以使用numpy
序列化dump()
数组,并使用dump_session()
序列化整个解释器会话。
然而,听起来你真的在问某种形式的缓存......所以我不得不说@Alfe的评论可能更接近你想要的。如果您想要无缝缓存和将数组存档到内存......那么您需要joblib
或klepto
。
klepto
建立在dill
之上,可以将函数输入和输出缓存到内存中(这样计算不需要运行两次),它可以无缝地持久化对象。缓存到磁盘或数据库。
github上的版本是你想要的。 https://github.com/uqfoundation/klepto或https://github.com/joblib/joblib。 Klepto比较新,但拥有比joblib更广泛的缓存和归档解决方案。 Joblib已经在生产中使用更长时间,因此它经过了更好的测试 - 特别是对于并行计算。
以下是典型的klepto工作流程示例:https://github.com/uqfoundation/klepto/blob/master/tests/test_workflow.py
这是另一个有numpy
的内容:
https://github.com/uqfoundation/klepto/blob/master/tests/test_cache.py
答案 1 :(得分:0)
Dill
可以是您的解决方案:https://pypi.python.org/pypi/dill
Dill为用户提供与'pickle'模块相同的界面,并且 还包括一些额外的功能。除了酸洗蟒蛇 对象,dill提供了保存解释器状态的能力 单个命令中的会话。因此,保存一个是可行的 解释器会话,关闭解释器,将pickle文件发送到 另一台计算机,打开一个新的翻译,取消会议和 从而继续从原始翻译的“保存”状态 会话。
一个例子:
import dill as pickle;
from numpy import array;
a = array([1,2]);
pickle.dump_session('sesion.pkl')
a = 0;
pickle.load_session('sesion.pkl')
print a;
由于dill符合'pickle'界面,例子和 http://docs.python.org/library/pickle.html上的文档也适用 如果一个人将
import dill as pickle
请注意,您无法保存多种类型的数据。先检查一下。