2

我有一个充当服务器的 Python (2.7) 脚本,因此它将运行很长时间。该脚本有一堆值来跟踪哪些值可以根据客户输入随时更改。

我理想地追求的是可以在内存中保留 Python 数据结构(基本上具有类型dictlist、和– JSON 的值)的东西unicode,让我可以随心所欲地更新它(除了引用任何引用类型实例一次)同时在人类可读的文件中保持这些数据是最新的,这样即使拔掉电源插头,服务器也可以启动并继续使用相同的数据。intfloat

我知道我基本上是在谈论数据库,但是我保留的数据将非常简单,并且大多数时候可能小于 1 kB,因此我正在寻找可以为我提供所描述的最简单的解决方案数据的完整性。有没有好的 Python (2.7) 库可以让我做这样的事情?

4

5 回答 5

4

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

于 2010-11-24T00:25:25.907 回答
2

人类可读要求的任何原因?

我建议查看 sqlite 以获得简单的数据库解决方案,或者查看 pickle 以获得序列化对象并将它们写入磁盘的简单方法。不过,两者都不是特别适合人类阅读的。

正如您所暗示的,其他选项是 JSON 或 XML - 使用内置的 json 模块来序列化对象,然后将其写入磁盘。启动时,检查该文件是否存在并在需要时加载数据。

文档

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}
于 2010-11-24T00:31:39.213 回答
2

我同意您不需要完全成熟的数据库,因为您似乎只需要 atomic file writes。您需要分两部分解决这个问题,序列化/反序列化和原子写入。

对于第一部分,jsonpickle可能是适合您的格式。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.renameis 将覆盖现有文件并且在 POSIX 上是原子的,但遗憾的是在 Windows 上并非如此。在 Windows 上,有可能os.unlink会成功但会失败,os.rename这意味着您只有. 如果您的目标是 Windows,则在检查是否存在.backup_filenamefilenamefilename

如果可能有多个并发写入器,则必须考虑同步构造。

于 2010-11-24T02:21:47.883 回答
1

由于您提到您的数据很小,所以我会采用一个简单的解决方案并使用pickle模块,它可以让您非常轻松地将 python 对象转储到一行中。

然后,您只需设置一个线程,在定义的时间间隔内将您的对象保存到文件中。

不是“图书馆”解决方案,但是 - 如果我了解您的要求 - 足够简单,您不需要真正需要一个。

编辑:您提到您想涵盖在写入过程中出现问题的情况,从而有效地使其成为原子事务。在这种情况下,传统的方法是使用“基于日志的恢复”。它本质上是将记录写入日志文件,说明“写入事务已启动”,然后在完成后写入“写入事务已提交”。如果一个“started”没有对应的“commit”,那么你就回滚。

在这种情况下,我同意使用 SQLite 之类的简单数据库可能会更好。这可能有点矫枉过正,但另一方面,自己实现原子性可能会重新发明轮子(而且我没有找到任何明显的库可以为你做这件事)。

如果您决定采取狡猾的方式,该主题将在 Silberschatz 的操作系统书籍的“进程同步”一章中的“原子事务”部分下进行介绍。

一个非常简单(尽管可能不是“交易完美”)的替代方法是每次都记录到一个新文件中,这样如果有人破坏了你的历史记录。您甚至可以为每个文件添加校验和,以自动确定它是否损坏。

于 2010-11-24T00:35:57.410 回答
0

您正在询问如何实现一个提供ACID保证的数据库,但您没有提供一个很好的理由说明您不能使用现成的数据库。SQLite 非常适合这类事情,并为您提供这些保证。

但是,有KirbyBase。我从未使用过它,我认为它不能保证 ACID,但它确实具有您正在寻找的一些特征。

于 2010-11-24T00:28:45.640 回答