【问题标题】:in-memory database in PythonPython中的内存数据库
【发布时间】:2011-03-04 02:36:49
【问题描述】:

我正在用 Python 对一个大型数据库进行一些查询,以从数据库中获取一些统计信息。我希望这些统计信息存储在内存中,以便其他程序可以在不访问数据库的情况下使用它们。

我在考虑如何构造它们,在尝试设置一些复杂的嵌套字典后,我意识到一个好的表示方法是 SQL 表。不过,我不想将数据存储回持久数据库。是否有支持使用 SQL 语法查询数据的 SQL 数据库的内存中实现?

【问题讨论】:

    标签: python sql database in-memory-database


    【解决方案1】:

    SQLite3 可能会工作。 Python 接口does support SQLite3 C API 提供的内存实现。

    来自规范:

    您还可以提供特殊名称 :memory: 在 RAM 中创建数据库。

    交易也相对便宜,具体取决于您在做什么。要开始,只需:

    import sqlite3
    conn = sqlite3.connect(':memory:')
    

    然后您可以像使用常规数据库一样继续操作。

    取决于您的数据 - 如果您可以使用键/值(字符串、散列、列表、集合、排序集等) - Redis 可能是另一种探索的选择(正如您提到的那样,您想分享与其他程序)。

    【讨论】:

    • 应该提到,目前 - 截至 2020 年 - 当使用对 sqlite3 对象的并发访问时,这不起作用。所以这失败了,例如如果您打算将其用作支持并发访问的小型 Web 服务的简单后端(大多数 Web 框架在后台执行此操作)。
    【解决方案2】:

    这似乎并不明显,但pandas 有很多关系能力。见comparison with SQL

    【讨论】:

      【解决方案3】:

      我想,SQLite3 将是最好的选择。

      如果可能,请查看memcached。 (对于键值对,快速点亮!)

      更新 1:

      HSQLDB 用于 SQL Like 表。 (不支持python)

      【讨论】:

      • 几年后回到这一点,Redis 也是一个非常可行的选择,在这类事情上比 memcache 灵活得多(除非 SQL 是必须的)。
      【解决方案4】:

      派对迟到了,但 pyfilesystem2(我不隶属于它)似乎非常适合:

      https://pyfilesystem2.readthedocs.io

      pip install fs
      
      from fs import open_fs
      mem_fs = open_fs(u'mem://')
      ...
      

      【讨论】:

      • 这几乎就像我没有正确阅读问题一样。 Downvoter:我应该删除我的答案吗?
      • 库pyfilesystem2提供了一种将物理数据库存储到内存中的方法
      【解决方案5】:

      内存数据库通常不支持内存分页选项(针对整个数据库或某些表),即数据库的总大小应小于可用物理内存或最大共享内存大小。

      根据您的应用程序、数据访问模式、数据库大小和数据库的可用系统内存,您有以下几种选择:

      一个。 文件系统中的腌制 Python 数据
      它以腌制格式存储结构化的 Python 数据结构(例如字典/列表/元组/集合列表、列表/熊猫数据帧/numpy 系列的字典等),以便在未腌制时立即方便地使用它们。 AFAIK,Python 不使用文件系统作为内存中 Python 对象的后备存储,但主机操作系统可能会将 Python 进程换成更高优先级的进程。这适用于静态数据,与可用系统内存相比,内存大小更小。这些腌制数据可以复制到其他计算机,由同一台计算机中的多个相关或独立进程读取。实际的数据库文件或内存大小比数据大小具有更高的开销。这是访问数据的最快方式,因为数据在 Python 进程的同一内存中,并且无需查询解析步骤。

      b. 内存数据库
      它在内存中存储动态或静态数据。可能与 Python API 绑定的内存库有 Redis、sqlite3、Berkeley Database、rqlite 等。不同的内存数据库提供不同的功能

      • 数据库可能被锁定在物理内存中,因此它不会被主机操作系统交换到内存后备存储。但是,同一库的实际实现可能会因不同的操作系统而异。
      • 数据库可能由数据库服务器进程提供服务。
      • 内存中的内存可由多个相关或独立的进程访问。
      • 支持完整、部分或无 ACID 模型。
      • 内存数据库可以持久化到物理文件中,以便在重新启动主机操作时可用。
      • 支持快照或/和不同的数据库副本用于备份或数据库管理。
      • 支持使用主从、集群模型的分布式数据库。
      • 支持从简单的键值查找到高级查询、过滤、分组功能(如 SQL、NoSQL)

      c。 内存映射数据库/数据结构
      它存储可能大于主机操作系统的物理内存的静态或动态数据。 Python 开发人员可以使用诸如mmap.mmap()numpy.memmap() 之类的 API 将某些文件映射到进程内存空间。这些文件可以排列成索引和数据,以便可以通过索引查找来查找/访问数据。这其实是各种数据库库使用的机制。 Python 开发人员可以实施自定义技术来访问/更新数据效率。

      【讨论】:

        【解决方案6】:

        您可以使用像SQLite 这样的数据库。严格来说,它不是在内存中,但它相当轻巧,并且与您的主数据库完全分开。

        【讨论】:

        • SQLite3 数据库只能在内存中打开。它是 SQLite3 的一大优势。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多