Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的内存数据库_Python_Sql_Database_In Memory Database - Fatal编程技术网

Python中的内存数据库

Python中的内存数据库,python,sql,database,in-memory-database,Python,Sql,Database,In Memory Database,我正在用Python对一个大型数据库进行一些查询,以从数据库中获取一些统计信息。我希望这些统计数据在内存中,以便其他程序可以使用它们,而无需访问数据库 我在考虑如何构造它们,在尝试设置一些复杂的嵌套字典之后,我意识到一个好的表示应该是SQL表。不过,我不想将数据存储回持久数据库。是否有支持使用SQL语法查询数据的SQL数据库内存实现?我想,SQLite3将是最好的选择 如果可能的话,看一看。(对于键值对,快速照明!) 更新1: 对于类似SQL的表。(不支持python)SQLite3可能会工作。

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


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

我想,SQLite3将是最好的选择

如果可能的话,看一看。(对于键值对,快速照明!)

更新1:


对于类似SQL的表。(不支持python)

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

根据规范:

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

它也相对便宜的交易,这取决于你正在做什么。要开始,只需:

import sqlite3
conn = sqlite3.connect(':memory:')
然后,您可以像使用常规数据库一样继续操作


根据您的数据-如果您可以使用键/值(字符串、散列、列表、集合、排序集等)-可能是另一个需要探索的选项(正如您提到的,您希望与其他程序共享)

您可以使用类似的数据库。严格说来,它不是内存中的,但它相当轻,并且将完全与主数据库分离。

晚会进行得非常晚,但pyfilesystem2(我不属于该数据库)似乎非常适合:

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

它可能看起来不明显,但有很多相关功能。请参见

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

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

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

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

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

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

SQLite3数据库只能在内存中打开。这是SQLite3的一大优势。几年后再回到这一点上,Redis也是一个非常可行的选择,在这类事情上比memcache灵活得多(除非SQL是必须具备的)。应该提到的是,从2020年开始,在使用对SQLite3对象的并发访问时,这一点不起作用。例如,如果你计划将它用作支持并发访问的小型web服务的简单后端(大多数web框架都会在后台执行),那么这就失败了。这几乎就像我没有正确阅读问题一样。Downvoter:我应该删除我的答案吗?库pyfilesystem2提供了一种将物理数据库存储到内存中的方法
pip install fs