簡體   English   中英

Python中的內存數據庫

[英]in-memory database in Python

我正在用 Python 對大型數據庫進行一些查詢,以從數據庫中獲取一些統計信息。 我希望這些統計信息在內存中,以便其他程序無需訪問數據庫即可使用它們。

我正在考慮如何構造它們,在嘗試設置一些復雜的嵌套字典之后,我意識到一個很好的表示方法是 SQL 表。 不過,我不想將數據存儲回持久性數據庫。 是否有支持使用 SQL 語法查詢數據的 SQL 數據庫的內存中實現?

SQLite3 可能會工作。 Python 接口確實支持SQLite3 C API 提供的內存中實現。

從規范:

您還可以提供特殊名稱 :memory: 以在 RAM 中創建數據庫。

交易也相對便宜,這取決於你在做什么。 要開始,只需:

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

然后,您可以像使用常規數據庫一樣繼續操作。

根據您的數據 - 如果您可以使用鍵/值(字符串、散列、列表、集合、排序集合等) - Redis可能是另一種探索的選擇(正如您提到的,您想與其他程序共享)。

這可能看起來並不明顯,但Pandas有很多關系能力。 查看與 SQL 的比較

我想,那時 SQLite3 將是最好的選擇。

如果可能,請查看memcached (對於鍵值對,快速點亮!)

更新1:

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

參加聚會非常晚,但 pyfilesystem2(與我無關)似乎非常合適:

https://pyfilesystem2.readthedocs.io

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

內存數據庫通常不支持內存分頁選項(對於整個數據庫或某些表),即數據庫的總大小應小於可用物理內存或最大共享內存大小。

根據您的應用程序、數據訪問模式、數據庫大小和數據庫的可用系統內存,您有幾個選擇:

一種。 文件系統中的腌制 Python 數據
它以pickle格式存儲結構化的Python數據結構(例如字典/列表/元組/集合列表、列表字典/pandas數據幀/numpy系列等),以便在unpickled后立即方便地使用它們。 AFAIK,Python 不會隱式地使用文件系統作為 Python 對象在內存中的后備存儲,但主機操作系統可能會將 Python 進程換成更高優先級的進程。 這適用於靜態數據,與可用系統內存相比具有較小的內存大小。 這些腌制數據可以復制到其他計算機,由同一台計算機中的多個相關或獨立進程讀取。 實際的數據庫文件或內存大小比數據大小有更高的開銷。 這是訪問數據的最快方式,因為數據在 Python 進程的同一內存中,並且沒有查詢解析步驟。

內存數據庫
它在內存中存儲動態或靜態數據。 與 Python API 綁定的內存庫可能有 Redis、sqlite3、Berkeley Database、rqlite 等。不同的內存數據庫提供不同的功能

  • 數據庫可能被鎖定在物理內存中,因此它不會被主機操作系統交換到內存后備存儲。 然而,同一庫的實際實現可能因不同的操作系統而異。
  • 數據庫可由數據庫服務器進程提供服務。
  • 內存中可以被多個依賴或獨立的進程訪問。
  • 支持完全、部分或無 ACID 模型。
  • 內存數據庫可以持久保存到物理文件,以便在主機操作重新啟動時可用。
  • 支持快照或/和不同的數據庫副本進行備份或數據庫管理。
  • 支持采用主從、集群模式的分布式數據庫。
  • 支持從簡單的鍵值查找到高級查詢、過濾、分組功能(如 SQL、NoSQL)

C。 內存映射數據庫/數據結構
它存儲靜態或動態數據,這些數據可能大於主機操作系統的物理內存。 Python 開發人員可以使用諸如mmap.mmap() numpy.memmap() API 將某些文件映射到進程內存空間。 可以將文件排列成索引和數據,以便可以通過索引查找來查找/訪問數據。 這實際上是各種數據庫庫使用的機制。 Python 開發人員可以實施自定義技術來訪問/更新數據效率。

您可以使用像SQLite這樣的數據庫。 嚴格來說它不是內存,但它相當輕巧,並且與您的主數據庫完全分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM