我正在做一些数据整理,如果我可以将一堆字典放入内存数据库中,然后对其运行简单的查询,这会简单得多。
例如,类似:
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 对象、处理大量数据并提供索引功能以实现高效查询。让我们探讨一下一些流行的选择:
-
PickleDB:
-
PickleDB 是一个使用 Python 编写的简单易用的键值存储,它使用
pickle
在磁盘上序列化数据。 - 优点: 使用方便,并支持通过其键访问对象。
- 缺点: 不支持示例中所示的复杂索引或查询。
-
对于用例的适用性:由于缺乏复杂查询功能,PickleDB 可能不适合。
-
shelve:
-
shelve
模块是 Python 标准库的一部分,它为持久化对象提供了一个持久的类似字典的接口。 - 优点: 易于使用且内置于 Python 中。
- 缺点: 与 PickleDB 类似,它缺乏复杂查询的能力。
-
对于用例的适用性:与 PickleDB 一样,
shelve
由于缺乏高级索引功能而无法满足的要求。 -
SQLite(使用 SQLAlchemy 或 peewee 等 ORM):
-
SQLite 是一个轻量级数据库引擎,可以嵌入到 Python 应用程序中,而 SQLAlchemy 和 peewee 是流行的 ORM(对象关系映射器),它们提供了 Python 对象和关系数据库之间的一个抽象层。
- 优点: SQLite 功能强大且支持索引以实现快速查询。ORM 使能够使用类似 Python 的语法与数据库进行交互。
- 缺点: 需要一些设置和模式定义,尽管 ORM 可以简化此过程。
-
对于用例的适用性:如果需要强大的查询功能并且愿意进行一些初始设置,那么 SQLite 与 SQLAlchemy 或 peewee 相结合是一个不错的选择。但是,对非结构化数据的需求可能会使它比必要情况更复杂。
-
对象数据库(例如 ZODB):
-
ZODB 是专为存储 Python 对象而设计的对象数据库。
- 优点: 支持透明的持久化,这意味着可以像处理任何其他 Python 对象一样处理数据库中的对象。它还支持对数据库中对象的更改进行跟踪并提供回滚功能。
- 缺点: 可能比其他选项更复杂,而且如果主要需求是在内存中使用,则可能是矫枉过正。
-
对于用例的适用性:如果需要对象数据库的全部功能,包括对非结构化数据的强大支持,那么 ZODB 是一个强大的选择。
-
内存中的字典或列表,并使用自定义索引:
-
对于更轻量级的解决方案,可以使用 Python 字典或列表,并实现自己的索引逻辑来实现快速查询。
- 优点: 提供对数据结构和索引机制的完全控制。
- 缺点: 需要更多的手动实现工作。
- 对于用例的适用性:如果需要最大的灵活性和控制力并且愿意投入额外的实现工作,那么此选项是可行的。
建议:
对于的特定需求(支持 Python 对象、高效索引和非结构化数据),我建议考虑以下因素:
-
如果需要一个简单易用的解决方案并且可以处理一些自定义索引: 在内存中使用字典或列表并实现自己的索引逻辑。
-
如果需要一个更强大、功能齐全的对象数据库: 探索 ZODB,因为它非常适合管理大量复杂的 Python 对象,并提供强大的查询功能,而无需严格的模式。
-
如果需要关系数据库的功能并且不介意使用 ORM: 使用 SQLAlchemy 或 peewee 等 ORM 探索 SQLite,因为这提供了强大的索引和查询功能。
最终,最佳选择取决于项目的具体要求和优先级。
标签:python,database,data-munging From: 5161164