gpt4 book ai didi

python - 持久数据库状态策略

转载 作者:行者123 更新时间:2023-11-30 23:45:30 25 4
gpt4 key购买 nike

由于多次编辑,这个问题可能变得有点语无伦次。抱歉。

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

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

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

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

何时运行:

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

与此直接相关的是我应该进行哪种备份的问题。

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

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

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

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

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

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

最佳答案

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

自 2.5 版本起,Python 在标准库中就已支持 sqlite,sqlite3模块。由于 sqlite 数据库是作为单个文件实现的,因此在机器之间移动它们很简单,并且 Java 有 a number of different ways与 sqlite 交互。

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

State changes made to a system after its last image was saved are lost in the case of a system failure or shutdown. Saving an image for every single change would be too time-consuming for most systems

我认为您最好考虑其他形式的持久性,而不是在每次更改时尝试批量更新您的状态。例如,某种 journal可以很好地工作。这使得将任何更改附加到日志文件或一些类似结构的末尾变得很简单。

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

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

关于python - 持久数据库状态策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9487877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com