31

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

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

4

6 回答 6

51

SQLite3 可能会工作。Python 接口确实支持SQLite3 C API 提供的内存实现。

从规范:

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

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

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

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

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

于 2010-06-15T17:18:25.713 回答
6

可能看起来并不明显,但pandas有很多关系能力。查看与 SQL 的比较

于 2020-05-21T09:39:16.630 回答
1

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

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

更新 1:

HSQLDB for SQL Like 表。(不支持python)

于 2010-06-15T17:17:53.343 回答
1

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

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

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

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

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

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

于 2020-12-05T04:42:19.543 回答
1

派对迟到了,但 pyfilesystem2 (我不隶属于它)似乎是一个完美的选择:

https://pyfilesystem2.readthedocs.io

pip install fs
from fs import open_fs
mem_fs = open_fs(u'mem://')
...
于 2020-01-31T11:15:15.880 回答
0

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

于 2010-06-15T17:19:53.590 回答