31

大規模なデータベースでPythonでいくつかのクエリを実行して、データベースからいくつかの統計を取得しています。他のプログラムがデータベースにアクセスせずにそれらを使用できるように、これらの統計をメモリ内に配置したいと思います。

それらを構造化する方法を考えていたところ、複雑なネストされた辞書を設定しようとした後、適切な表現はSQLテーブルであることに気付きました。ただし、データを永続データベースに戻したくありません。SQL構文を使用したデータのクエリをサポートするSQLデータベースのメモリ内実装はありますか?

4

6 に答える 6

51

SQLite3が機能する可能性があります。Pythonインターフェースは、SQLite3CAPIが提供するメモリ内実装をサポートします。

仕様から:

特別な名前:memory:を指定して、RAMにデータベースを作成することもできます。

また、何をしているのかにもよりますが、トランザクションは比較的安価です。始めるには、次のようにします。

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

その後、通常のデータベースを使用していたように続行できます。

データによっては、キー/値(文字列、ハッシュ、リスト、セット、並べ替えられたセットなど)でうまくいく場合は、 Redisを探索する別のオプションになる可能性があります(他のプログラムと共有したいとおっしゃっていました)。

于 2010-06-15T17:18:25.713 に答える
6

当たり前のようには思えないかもしれませんが、パンダには多くのリレーショナル機能があります。SQLとの比較を参照してください

于 2020-05-21T09:39:16.630 に答える
1

その場合、SQLite3が最良のオプションになると思います。

可能であれば、memcachedを見てください。(キーと値のペアの場合、高速に点灯します!)

更新1:

HSQLDB forSQLLikeテーブル。(Pythonサポートなし)

于 2010-06-15T17:17:53.343 に答える
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 に答える
1

インメモリデータベースは通常、(データベース全体または特定のテーブルの)メモリページングオプションをサポートしていません。つまり、データベースの合計サイズは、使用可能な物理メモリまたは最大共有メモリサイズよりも小さくする必要があります。

アプリケーション、データアクセスパターン、データベースのサイズ、およびデータベースで使用可能なシステムメモリに応じて、いくつかの選択肢があります。

a。ファイルシステムのピクルスPythonデータ
構造化されたPythonデータ構造(辞書/リスト/タプル/セットのリスト、リスト/パンダデータフレーム/ numpyシリーズの辞書など)をピクルス形式で保存し、ピクルスを外すとすぐに便利に使用できるようにします。ちなみに、Pythonはメモリ内のPythonオブジェクトのバッキングストアとしてファイルシステムを暗黙的に使用しませんが、ホストオペレーティングシステムはPythonプロセスをより優先度の高いプロセスに交換する場合があります。これは静的データに適しており、使用可能なシステムメモリと比較してメモリサイズが小さくなります。これらのピクルス化されたデータは、他のコンピューターにコピーされ、同じコンピューター内の複数の依存プロセスまたは独立プロセスによって読み取られる可能性があります。実際のデータベースファイルまたはメモリサイズは、データのサイズよりもオーバーヘッドが高くなります。データはPythonプロセスの同じメモリにあるため、これはデータにアクセスするための最速の方法です。

b。インメモリデータベース
動的または静的データをメモリに保存します。Python APIバインディングを使用する可能性のあるインメモリライブラリは、Redis、sqlite3、Berkeley Database、rqliteなどです。異なるインメモリデータベースは、異なる機能を提供します

  • データベースは、ホストオペレーティングシステムによってメモリバッキングストアにスワップされないように、物理メモリにロックされている可能性があります。ただし、同じlibrayの実際の実装は、オペレーティングシステムによって異なる場合があります。
  • データベースは、データベースサーバープロセスによって提供される場合があります。
  • インメモリには、複数の依存プロセスまたは独立プロセスからアクセスできます。
  • 完全、部分的、またはACIDモデルなしをサポートします。
  • インメモリデータベースは、物理ファイルに対して永続的であるため、ホストの動作を再開したときに使用できます。
  • バックアップまたはデータベース管理のために、スナップショットまたは/およびさまざまなデータベースコピーをサポートします。
  • マスタースレーブ、クラスターモデルを使用した分散データベースをサポートします。
  • 単純なキー値ルックアップから高度なクエリ、フィルター、グループ関数(SQL、NoSQLなど)までのサポート

c。メモリマップデータベース/データ構造
ホストオペレーティングシステムの物理メモリよりも大きくなる可能性のある静的または動的データを格納します。mmap.mmap() numpy.memmap()Python開発者は、特定のファイルをプロセスメモリスペースにマップするなどのAPIを使用できます。ファイルをインデックスとデータに配置して、インデックスルックアップを介してデータをルックアップ/アクセスできるようにすることができます。これは実際には、さまざまなデータベースライブラリで使用されるメカニズムです。Python開発者は、データ効率にアクセス/更新するためのカスタム手法を実装できます。

于 2020-12-05T04:42:19.543 に答える
0

SQLiteのようなデータベースを使用できる可能性があります。厳密に言えばメモリ内ではありませんが、かなり軽量であり、メインデータベースから完全に分離されています。

于 2010-06-15T17:19:53.590 に答える