Python的快速可搜索字典存储

2 投票
4 回答
1717 浏览
提问于 2025-04-15 13:02

目前我在用 SQLite(配合 SQLAlchemy)来存储大约5000个字典对象。每个字典对象对应一个PyPI的条目,里面有一些键,比如名字、版本、摘要……有时候'描述'的内容可能会跟项目文档一样多。

把这些条目(从JSON格式)写回到磁盘(SQLite格式)需要几秒钟,感觉有点慢。

写入的频率大约是一天一次,但根据某个键(通常是名字或描述)读取或搜索特定条目的次数却非常频繁。

就像使用apt-get一样。

有没有比SQLite更适合我需求的Python存储库?

4 个回答

0

根据提到的大约5000个对象的数量,SQLite可能并不是速度慢的原因。问题可能出在中间的处理方式上,比如使用JSON,或者SQLAlchemy的使用方式不够优化。

可以试试这个方法(即使是处理一百万个对象也相当快):
y_serial.py模块 :: 用SQLite存储Python对象

“序列化 + 持久化 :: 只需几行代码,就能把Python对象压缩并注释到SQLite中;然后可以根据关键词按时间顺序取出这些对象,而不需要使用SQL。这是一个非常实用的‘标准’模块,用于存储没有固定结构的数据。”

http://yserial.sourceforge.net

yserial在你的关键词搜索时,是在SQLite那边使用正则表达式(“regex”)代码,而不是Python,所以这也是一个显著的速度提升。

让我们知道效果如何。

1

这可能对你的应用来说有点过于复杂,但你可以看看无模式/文档导向的数据库。个人来说,我比较喜欢couchdb。简单来说,这种数据库不是像传统的那样把记录存成表格的行,而是存储键值对。以couchdb为例,你需要的数据可以通过用JavaScript写的视图来提取。这类数据库通常比关系型数据库更容易扩展,而且在你的情况下可能会更快,因为你不需要把数据强行调整成适合关系型数据库的格式。不过,这也意味着你需要运行另一个服务。

2

你有没有在名字和描述上加索引?如果你在5000个有索引的条目中搜索,应该是非常快的(当然,使用ORM工具会让你更麻烦,通常都是这样,即使是像SQLAlchemy这样相对不错的工具,但试试“原生sqlite”,那速度绝对会很快)。

写入更新的条目(同样使用真实的SQL)也应该是基本上瞬间完成的——理想情况下,一条更新语句就能搞定,但即使是一千条也没什么大问题,只要确保在循环开始时关闭自动提交(如果你想的话,之后再打开也可以)。

撰写回答