我有作为服务器一个Python(2.7)脚本,因此将运行的时间非常长的时期。此脚本有一堆值,以跟踪哪些可以在任何时间基于客户端输入而改变。

什么,我的理想是以后的东西,可以保持一个Python数据结构(与类型dictlistunicodeintfloat的价值观 - JSON,基本上)在内存中,让我更新它,但是我想(引用除外任何引用类型实例不止一次),同时也保持该数据的最高最新的人类可读的文件,这样即使电源插头被拔掉,服务器可以只启动和继续使用相同的数据。

我知道我基本上谈论的是一个数据库,但我保持的数据将非常简单,大概不到1 KB的大部分时间,所以我在寻找可能的最简单的解决方案,可以提供给我与所描述的数据的完整性。是否有良好的Python(2.7),让我做这样的事情库?

有帮助吗?

解决方案

我同意,你并不需要一个完全成熟的数据库,如似乎所有你想要的是原子文件写入即可。您需要在两个部分,系列化/ deserialisation,和原子写作来解决这个问题。

有关的第一部分,json,或pickle可能合适格式你。 JSON有被人类可读的优势。它没有看起来好像这个你尽管面临的首要问题根本。

一旦序列化的对象为字符串,使用以下过程将文件写入磁盘原子,假设一个单一并发作家(至少在POSIX,见下文):

import os, platform
backup_filename = "output.back.json"
filename = "output.json"

serialised_str = json.dumps(...)
with open(backup_filename, 'wb') as f:
     f.write(serialised_str)
if platform.system() == 'Windows':
     os.unlink(filename)
os.rename(backup_filename, filename)

虽然os.rename是将覆盖现有文件,一POSIX原子,这是不幸的是不能在Windows的情况。在Windows上,是os.unlink会成功,但os.rename会失败,这意味着你只有backup_filename并没有filename的可能性。如果你是针对Windows,你需要考虑这种可能性,当你检查filename的存在。

如果有多于一个的并行写入器的可能性,你将不得不考虑同步构建体。

其他提示

好吧,既然你知道我们基本上谈论一个数据库,虽然一个非常简单的,你可能不会感到惊讶,我建议你看看的 sqlite3的模块。

任何理由人类可读要求?

我建议在寻找sqlite的一个简单的数据库解决方案,或咸菜一个简单的方法来还原序列化对象,并将其写入到磁盘中。既不是特别是人可读虽然。

其他选项是JSON或XML作为你暗示 - 使用内置的JSON模块序列化的对象,然后写到磁盘。当启动时,检查该文件的存在,并且如果需要的话加载数据。

文档

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

既然你提到你的数据很小,我会去用一个简单的解决方案,并使用的泡菜模块,你倾倒Python对象成一条线,它可以让非常容易

然后你只需设置保存你的对象到一个文件中定义的主题的时间间隔。

不是“libraried”解决方案,但 - 如果我理解您的需求 - 简单够你不会真的需要一个

编辑:你提到你想该写本身过程中出现问题,以覆盖的情况下,有效地使它成为一个原子事务。在这种情况下,传统的方式是使用“基于日志的恢复”去了。它本质上是写记录到日志文件中说,“写事务开始”,然后写“写事务comitted”时,即可大功告成。如果一个“开始”有没有相应的“承诺”,那么你回滚。

在这种情况下,我同意,你可能会更好用一个简单的数据库SQLite的一样。这可能是一个轻微的矫枉过正,但在另一方面,实施原子自己可能会被重新发明轮子一点(我没有找到为你做任何明显的库)。

如果你决定去狡猾的方式,这个话题被覆盖上Silberschatz的操作系统书的进程同步章,下节“原子交易”。

有一个非常简单的(尽管也许不是“事务完美”)替代方案是只是为了记录到一个新的文件每一次,因此,如果一个腐化你有一个历史。您可以校验每个文件甚至添加自动确定它是否打破。

您是问如何实现它提供 ACID 保证数据库,但是你没有提供了很好的理由,为什么你不能用一个现成的架子。 SQLite是适合这样的事情,让您的保证。

然而,存在 KirbyBase 。我从来没有使用过它,我不认为它使ACID的保证,但它确实有一些你正在寻找的特性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top