【问题标题】:Single-file storage for a Python applicationPython 应用程序的单文件存储
【发布时间】:2010-09-01 11:06:04
【问题描述】:

我开始开发一个 Python 应用程序,它提供了一个用于编辑各种图形和数字实体的 GUI(如果你必须知道的话,它是一个移动机器人的配置和管理工具)。问题之一是如何存储项目的数据(意思是机器人)。数据量将很低(最大约 10MB)且非常异构(机器人的几何数据、地图、任务、平台日志、记录的传感器数据、项目偏好等)。

我不想开发自己的存储层。项目数据应存储在单个文件中,并且可以从 Python 轻松访问。存储更新应该很便宜:我不想使用明确的“保存”操作,并且更改应该在发生时立即存储。

单个 ZIP 文件可能不实用,并且需要在顶部编写持久层以将应用程序对象映射到存储。 SQLite 是一个明显的候选者,可能使用 SQLAlchemy 作为对象关系层。 ZODB 看起来也很有趣,但到目前为止我还没有使用它的经验。

有什么建议吗?

编辑:当我说“应用程序”时,我指的是要安装在用户计算机上的程序,而不是 Web 应用程序。

编辑:我将打开由其他人(不一定受信任)创建的数据文件,类似于我对 Word 或 PDF 文件所做的事情。这一定是安全的操作。

【问题讨论】:

  • 好的,任何基于泡菜的东西都出来了。在 Windows 上试试这个:import pickle; pickle.loads("cos\nsystem\n(S'dir'\ntR.")
  • 没有更多的想法,所以我将尝试 SQLite 和 SQLAlchemy。感谢您的回复。

标签: python storage


【解决方案1】:

shelve 提供了一个映射接口,允许您存储任何可腌制类型。

【讨论】:

  • 触摸;搁置可能是理想的选择。
  • IIUC,搁置使用pickle进行序列化。跨操作系统/架构的泡菜格式有多“稳定”?我能否用 64 位 Windows 打开存储在 32 位 Windows 上的书架?跨平台操作(Windows/OS X/Linux)不是必需的,但最好有。
  • 如果你想缓解跨平台问题,那么你可以用 jsonpickle 替换适当的酸洗方法。 jsonpickle.github.com
  • jsonpickle 看起来很有趣,除了这一部分:“从不受信任的来源加载 JSON 字符串表示潜在的安全漏洞”,我记得读过关于 pickle 的相同内容。我宁愿不必担心从(恶意)客户那里打开项目文件并让它擦除我的硬盘:)
  • @S.Lott:能够破解代码不是这里的问题,因为我将从受信任的来源(我自己)安装我自己的应用程序实例。我要避免的用例是从“邪恶”客户(使用安装在他计算机上的应用程序创建)那里获取恶意项目文件,然后在我的计算机上打开它,删除我的所有文件。如果 unpickling 可以触发例如os.unlink()。我们已经受够了 Word 文件...
【解决方案2】:

我鼓励您像您在问题中讨论的那样查看 SQLAlchemy。您可以将 SQLite 中的表映射到 Python 对象。使用 SQLAlchemy 会话 (http://www.sqlalchemy.org/docs/session.html#what-does-the-session-do),您可以运行查询、将对象添加到表中并立即发出 session.commit 命令,以便将数据自动保存到 SQLite。

新数据元素:

ed_user = User('ed', 'Ed Jones', 'edspassword') #user is the class you mapped the table to
session.add(ed_user)
session.commit() # basically auto saving here :)

这就是我要使用的。我现在正在将 SQLAlchemy 用于一个项目,并且喜欢我所看到的。更多信息请看这里:http://www.sqlalchemy.org/docs/ormtutorial.html#adding-new-objects

【讨论】:

    【解决方案3】:

    Pickle它!

    在内存中按你喜欢的方式构建你的数据结构,然后在你想保存时用 pickle 将它们快速保存到磁盘。

    【讨论】:

    • 我不希望每次更改内存数据都腌制 10MB 的数据。
    • 参见上面的搁置,@Ignacio ;) -- 尽管如此,你真的想尝试使磁盘数据与内存中的数据保持同步吗?听起来像一个适当的事务数据库的工作......当你的应用程序关闭时只写一次更容易?
    • 是的,事务数据库可能是理想的,这就是我开始研究 SQLite 的原因。使磁盘数据与内存数据保持同步是一种设计选择:我不希望用户不得不考虑保存。他应该能够随时关闭应用程序(或者让它崩溃,就此而言),而不会丢失任何数据并且不会延迟。
    【解决方案4】:

    为什么不试试 couchdb 呢?由于您的数据是异构的,因此这是最好的方法。易于使用,10MB 无所谓:http://pypi.python.org/pypi/CouchDB

    【讨论】:

      【解决方案5】:

      OP提到的ZODB是恕我直言的最佳选择。

      这是一个高质量的介绍,阅读后可能会做出决定 http://www.ibm.com/developerworks/aix/library/au-zodb/

      请注意,至于文章末尾提到的复制,ZRS 不再只是封闭源代码商业,而是已开源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        • 2017-09-24
        • 1970-01-01
        • 2018-11-23
        • 2021-12-10
        相关资源
        最近更新 更多