1

由于多次编辑,这个问题可能变得有点不连贯。我道歉。

我目前正在编写一个 Python 服务器。它永远不会看到超过 4 个活跃用户,但我是一名计算机科学专业的学生,​​所以无论如何我都在计划它。

目前,我即将实现一个功能,将所有相关变量的当前状态备份保存到 CSV 文件中。我目前有 10 个,它们永远不会很大,但是……嗯,计算机科学专业的学生等等。

所以,我目前正在考虑两件事:

  1. 何时运行备份?
  2. 什么样的备份?

何时运行:

我可以在每次变量更改时运行备份,其优点是始终在备份中保留当前状态,或者每分钟一次,其优点是如果服务器每分钟不重写文件数百次变得很忙,但是如果我不检测自上次备份以来哪些变量发生了变化,则会对相同的数据进行大量无用的重写。

与此直接相关的是我应该做什么样的备份的问题。

我可以对所有变量进行完整备份(如果我在每次变量更改时都运行备份,这是没有意义的,但如果我每 X 分钟运行一次备份可能会很好),或者对单个变量进行完整备份变量(如果我在每次变量更改时进行备份会更好,但会涉及多个备份功能或对当前备份的变量的智能检测),或者我可以尝试某种增量备份文件(这可能涉及读取当前文件并用更改重写它,所以它可能非常愚蠢,除非在 Python 中有一个我不知道的技巧)。

我不能使用shelves,因为我希望数据可以在不同的编程语言之间移植(例如,java,可能无法打开 python 架子),我不能使用 MySQL 有不同的原因,主要是运行服务器的机器不支持 MySQL而且我不想使用外部 MySQL-Server,因为我希望服务器在 Internet 连接断开时继续运行。

我也知道有几种方法可以使用 python 和/或其他软件(sqlite例如)的预实现功能来做到这一点。我只是自己构建这些东西的忠实粉丝,不是因为我喜欢重新发明轮子,而是因为我喜欢知道我使用的东西是如何工作的。我构建这个服务器部分只是为了学习 python,虽然知道如何使用 SQLite 是有用的,但我也喜欢自己做“肮脏的工作”。

在我每天可能有几个请求的使用场景中,我倾向于“更改备份”的想法,但是如果由于某种原因,服务器变得非常非常繁忙,那么这种想法很快就会崩溃。

所以,我的问题基本上归结为:在这种情况下哪种备份方法最有用,我是否可能错过了另一种备份策略?您如何决定在您的应用程序中使用哪种策略?

请注意,我提出这个问题主要是出于对备份策略及其背后的想法的普遍好奇,而不是因为这种特殊情况下的问题。

4

2 回答 2

2

使用sqlite。您正在询问如何使用 csv 文件构建持久存储,以及如何在事情发生变化时更新文件。您需要的是一个轻量级、可移植的关系(如基于表的)数据库。Sqlite 非常适合这种情况。

自 2.5 版以来,Python 已在标准库中使用sqlite3模块支持 sqlite。由于 sqlite 数据库是作为单个文件实现的,因此跨机器移动它们很简单,并且 Java 有许多不同的方式与 sqlite 交互。

我完全是为了学习而做事,但如果你真的想学习数据持久性,我不会把自己嫁给“csv数据库”的想法。我将首先查看Persistence的维基百科页面。您正在考虑的基本上是您的数据的“系统映像”。维基百科文章描述了您提到的这种方法的一些相同缺点:

在系统发生故障或关闭的情况下,保存最后一个映像后对系统所做的状态更改会丢失。对于大多数系统来说,为每一次更改都保存一张图像太耗时了

与其在每次更改时都尝试更新你的状态,我认为你最好看看其他形式的持久性。例如,某种期刊可以很好地工作。这使得将任何更改附加到日志文件或类似结构的末尾变得很简单。

但是,如果您最终有许多并发用户,并且进程在多个线程上运行,您会担心您的更改是否是原子的,或者它们是否相互冲突。虽然操作系统通常有一些方法来处理锁定文件以进行编辑,但您正在打开一罐蠕虫试图了解它如何工作以及如何与您的系统交互。此时,您又回到了需要数据库的状态。

当然,可以尝试几种不同的方法。但是,一旦您希望让它以清晰一致的方式工作,请使用 sqlite。

于 2012-02-28T21:20:14.720 回答
1

如果您的数据在 CSV 文件中,为什么不对这些文件使用修订控制系统呢?例如, git会非常快并提供出色的历史记录。存储库将完全包含在文件所在的目录中,因此很容易处理。您还可以轻松地将该存储库复制到其他机器或目录。

于 2012-02-28T20:49:41.853 回答