首页 > 编程问答 >Python:支持索引的内存对象数据库?

Python:支持索引的内存对象数据库?

时间:2024-07-23 05:56:12浏览次数:11  
标签:python database data-munging

我正在做一些数据整理,如果我可以将一堆字典放入内存数据库中,然后对其运行简单的查询,这会简单得多。

例如,类似:

people = db([
    {"name": "Joe", "age": 16},
    {"name": "Jane", "favourite_color": "red"},
])
over_16 = db.filter(age__gt=16)
with_favorite_colors = db.filter(favorite_color__exists=True)

有不过,存在三个混淆因素:

  • 某些值将是 Python 对象,并且序列化它们是不可能的(太慢,破坏身份)。当然,我可以解决这个问题(例如,通过将所有项目存储在一个大列表中,然后在该列表中序列化它们的索引......但这可能需要相当多的摆弄)。
  • 将会有数千个数据,我将对它们运行大量查找操作(如图形遍历),因此 必须 能够执行高效(即索引)查询。
  • 如示例中所示,数据是| ||非结构化 ,所以需要我预定义模式的系统会很棘手。 那么,这样的事情存在吗?或者我需要把一些东西拼凑在一起吗?

So, does such a thing exist? Or will I need to kludge something together?


当然可以,Python 提供了几种可以满足需求的内存数据库选项。这些选项能够存储 Python 对象、处理大量数据并提供索引功能以实现高效查询。让我们探讨一下一些流行的选择:

  1. PickleDB:

  2. PickleDB 是一个使用 Python 编写的简单易用的键值存储,它使用 pickle 在磁盘上序列化数据。

  3. 优点: 使用方便,并支持通过其键访问对象。
  4. 缺点: 不支持示例中所示的复杂索引或查询。
  5. 对于用例的适用性:由于缺乏复杂查询功能,PickleDB 可能不适合。

  6. shelve:

  7. shelve 模块是 Python 标准库的一部分,它为持久化对象提供了一个持久的类似字典的接口。

  8. 优点: 易于使用且内置于 Python 中。
  9. 缺点: 与 PickleDB 类似,它缺乏复杂查询的能力。
  10. 对于用例的适用性:与 PickleDB 一样, shelve 由于缺乏高级索引功能而无法满足的要求。

  11. SQLite(使用 SQLAlchemy 或 peewee 等 ORM):

  12. SQLite 是一个轻量级数据库引擎,可以嵌入到 Python 应用程序中,而 SQLAlchemy 和 peewee 是流行的 ORM(对象关系映射器),它们提供了 Python 对象和关系数据库之间的一个抽象层。

  13. 优点: SQLite 功能强大且支持索引以实现快速查询。ORM 使能够使用类似 Python 的语法与数据库进行交互。
  14. 缺点: 需要一些设置和模式定义,尽管 ORM 可以简化此过程。
  15. 对于用例的适用性:如果需要强大的查询功能并且愿意进行一些初始设置,那么 SQLite 与 SQLAlchemy 或 peewee 相结合是一个不错的选择。但是,对非结构化数据的需求可能会使它比必要情况更复杂。

  16. 对象数据库(例如 ZODB):

  17. ZODB 是专为存储 Python 对象而设计的对象数据库。

  18. 优点: 支持透明的持久化,这意味着可以像处理任何其他 Python 对象一样处理数据库中的对象。它还支持对数据库中对象的更改进行跟踪并提供回滚功能。
  19. 缺点: 可能比其他选项更复杂,而且如果主要需求是在内存中使用,则可能是矫枉过正。
  20. 对于用例的适用性:如果需要对象数据库的全部功能,包括对非结构化数据的强大支持,那么 ZODB 是一个强大的选择。

  21. 内存中的字典或列表,并使用自定义索引:

  22. 对于更轻量级的解决方案,可以使用 Python 字典或列表,并实现自己的索引逻辑来实现快速查询。

  23. 优点: 提供对数据结构和索引机制的完全控制。
  24. 缺点: 需要更多的手动实现工作。
  25. 对于用例的适用性:如果需要最大的灵活性和控制力并且愿意投入额外的实现工作,那么此选项是可行的。

建议:

对于的特定需求(支持 Python 对象、高效索引和非结构化数据),我建议考虑以下因素:

  • 如果需要一个简单易用的解决方案并且可以处理一些自定义索引: 在内存中使用字典或列表并实现自己的索引逻辑。

  • 如果需要一个更强大、功能齐全的对象数据库: 探索 ZODB,因为它非常适合管理大量复杂的 Python 对象,并提供强大的查询功能,而无需严格的模式。

  • 如果需要关系数据库的功能并且不介意使用 ORM: 使用 SQLAlchemy 或 peewee 等 ORM 探索 SQLite,因为这提供了强大的索引和查询功能。

最终,最佳选择取决于项目的具体要求和优先级。

标签:python,database,data-munging
From: 5161164

相关文章

  • 如何构建一维数组的二维数组的特定 Python 结构?
    如何构建一维数组(即行向量)的二维数组的特定结构以满足特定我正在维护的遗留程序的结构?我可以在此结构中生成正确的内容all_measurements[:12]array([[0.,0.,0.,2.],[0.02,0.334,0.04,2.24],[0.04,0.668,0.08,2.48],...........
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......
  • python 用单斜杠-反斜杠替换url字符串中的双斜杠
    我的URL包含错误的双斜杠(“//”),我需要将其转换为单斜杠。不用说,我想保持“https:”后面的双斜杠不变。可以在字符串中进行此更改的最短Python代码是什么?我一直在尝试使用re.sub,带有冒号否定的正则表达式(即,[^:](//)),但它想要替换整个匹配项(包括前面......