Python中的内存数据库

36

我在Python中对大型数据库进行一些查询,以从数据库中获取一些统计信息。我希望这些统计信息可以存储在内存中,使得其他程序可以使用它们而无需访问数据库。

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

6个回答

59

SQLite3 可能有效。Python 接口支持 SQLite3 C API 提供的内存实现。

从规范中可以看到:

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

在事务方面也相对便宜,具体取决于你要做什么。只需进行以下操作即可开始:

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

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

根据你的数据类型,如果你可以使用键/值对(字符串、哈希、列表、集合、有序集合等),那么Redis可能是另一个需要探索的选择(因为你提到了你想与其他程序共享)。


6
需要注意的是,目前(截至2020年),在使用并发访问sqlite3对象时,此方法无法正常工作。因此,如果您计划将其用作支持并发访问的小型Web服务的简单后端(大多数Web框架在幕后都会这样做),则此方法将失败。 - omni

8

2

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

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

a. 文件系统中的Pickled Python数据
它以pickled格式存储结构化的Python数据结构(例如字典/列表/元组/集合列表、列表/ pandas数据框架/ numpy系列的字典等),以便在反pickle后可以立即方便地使用。据我所知,Python不会隐式地将文件系统用作Python对象在内存中的后备存储,但主机操作系统可能会将Python进程与更高优先级的进程交换出来。这适用于静态数据,其内存大小比可用系统内存小。这些pickled数据可以复制到其他计算机上,在同一台计算机上由多个相关或独立进程读取。实际数据库文件或内存大小的开销比数据的大小更高。这是访问数据的最快方式,因为数据位于Python进程的相同内存中,无需查询解析步骤。

b. 内存数据库
它将动态或静态数据存储在内存中。具有Python API绑定的可能的内存库包括Redis、sqlite3、Berkeley Database、rqlite等。不同的内存数据库提供不同的功能。
  • 数据库可以被锁定在物理内存中,以便它不会被主机操作系统交换到内存后备存储器中。但是,同一库的实际实现可能因不同的操作系统而异。
  • 数据库可以由数据库服务器进程提供服务。
  • 内存可以被多个相关或独立的进程访问。
  • 支持完全、部分或无ACID模型。
  • 内存数据库可以持久化到物理文件中,以便在主机操作重新启动时可用。
  • 支持快照和/或不同的数据库副本进行备份或数据库管理。
  • 支持使用主从、集群模型的分布式数据库。
  • 支持从简单的键值查找到高级查询、过滤、分组函数(例如SQL、NoSQL)。
c. 内存映射数据库/数据结构
它存储静态或动态数据,可能比主机操作系统的物理内存更大。Python开发人员可以使用API,如mmap.mmap()numpy.memmap()将某些文件映射到进程内存空间中。这些文件可以按索引和数据排列,以便通过索引查找访问数据。这实际上是各种数据库库使用的机制。Python开发人员可以实现自定义技术来有效地访问/更新数据。

2
非常晚才参加派对,但是我不隶属于 pyfilesystem2,它似乎是一个完美的选择:

https://pyfilesystem2.readthedocs.io

pip install fs

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

这就好像我没有仔细阅读问题一样。点踩的人:我应该删除我的答案吗? - jtlz2
库pyfilesystem2提供了一种将物理数据库存储到内存中的方式。 - yoonghm

1

我猜,SQLite3可能是最好的选择。

如果可能的话,请看一下memcached。(用于键值对,速度非常快!)

更新1:

HSQLDB 用于类似SQL的表格。(不支持Python)


几年后回过头来看,Redis也是一种非常可行的选择,比memcache更具灵活性,适用于这种情况(除非必须使用SQL)。 - Tim Post

0

你可以考虑使用像SQLite这样的数据库。它虽然不是严格意义上的内存数据库,但非常轻量级,并且完全独立于你的主数据库。


3
SQLite3 数据库可以仅在内存中打开,这是 SQLite3 的一个巨大优势之一。 - Tim Post

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接