Python的轻量级崩溃恢复

2024-05-16 20:44:55 发布

您现在位置:Python中文网/ 问答频道 /正文

为我的程序处理轻量级崩溃恢复的最佳方法是什么?在

我有一个Python程序,它运行许多测试用例,结果存储在一个用作缓存的字典中。如果我可以保存(然后恢复)添加到字典中的每一项,我可以简单地再次运行程序,缓存将提供适当的崩溃恢复。在

  1. 您可以假设字典中的键和值很容易转换为字符串,即使用str或pickle module。在
  2. 我希望这是完全跨平台的——至少和Python一样跨平台
  3. 我不想简单地把每个值都写到一个文件中,然后把它加载到我的程序中,在我写文件的时候可能会崩溃
  4. 更新:这是一个轻量级模块,因此DBMS是不可能的。在
  5. 更新:Alex是正确的,我实际上不需要来防止写出来时的崩溃,但在某些情况下,我希望能够在可恢复状态下手动终止它。在
  6. 更新使用下面的标准输入添加了一个高度受限的解决方案

Tags: 模块文件方法字符串程序字典跨平台情况
3条回答

pickle模块支持将对象序列化到文件(以及从文件加载):

http://docs.python.org/library/pickle.html

一种可能是创建一些较小的文件。。。每一个都代表你试图保存的状态的子集,每个都有一个校验和或标记,表明它作为文件的最后一行/数据已经完成(就在文件关闭之前)。在

如果校验和/标记良好,那么其余的数据可以被认为是有效的。。。尽管程序随后必须找到所有这些文件,打开并读取所有文件,并使用您提供的元数据(在它们的头或名称中?)确定哪些是最新的内聚状态表示(或检查点),您可以从中继续处理。在

如果不了解您正在处理的数据的性质,就不可能更具体。在

当然,您可以使用文件,也可以使用DBMS系统。任何像样的DBMS(PostgreSQL,MySQL,如果您使用了适当的存储后端)都可以为您提供ACID保证和事务支持。因此,您读回的数据应该始终与您在模式中设置的约束和/或您处理的事务(BEGIN、COMMIT、ROLLBACK)一致。在

将序列化日期发布到DBMS的一个可能的优点是,您可以将DBMS托管在一个单独的系统上(这不太可能同时遭受与测试主机相同的不稳定性)。在

没有什么好方法可以防止“当你的程序在向文件中写入检查点时程序崩溃”,但是你为什么要如此担心这个问题呢?!除了“将检查点保存到文件”之外,您的程序还做了什么,这很容易导致它崩溃?!在

在Python中,序列化的可移植性很难超过pickle(或cPickle),但这只是“将键和值转换为字符串”。对于保存键值对(一旦字符串化),很少有方法比仅仅附加到文件中更安全(如果崩溃的频率远远超过正常值,则不要对文件进行pickle,正如您所建议的那样)。在

如果您的环境由于任何原因极易崩溃(非常廉价硬件?-),只需确保关闭该文件(如果操作系统也容易崩溃,请使用fflush;-),然后重新打开它进行追加。这样,最糟糕的情况是最新的追加将不完整(由于中途发生崩溃),然后您只需捕获取消拾取不完整记录所引发的异常,并只重做未保存的内容(因为它们由于崩溃而未完成,或者是因为它们已经完成,但由于崩溃而没有完全保存,最终也会有相同的结果)。在

如果您可以选择对数据库引擎进行检查点(而不仅仅是对文件执行检查点),请认真考虑!数据库引擎将保存事务日志并确保ACID属性,如果您可以信赖的话,这将使您的应用程序端编程更加容易!-)在

相关问题 更多 >