适用于Python的快速,可搜索的dict存储

时间:2009-07-21 02:16:50

标签: python sqlite data-storage

当前我使用SQLite(w / SQLAlchemy)来存储大约5000个dict对象。每个dict对象对应于PyPI中带有键的条目 - (名称,版本,摘要......有时“描述”可以与项目文档一样大。)

将这些条目(从JSON)写回磁盘(SQLite格式)需要几秒钟,而且感觉很慢。

每天进行一次频繁的写作,但是经常根据键(通常是名称或描述)读取/搜索特定条目。

就像apt-get。

是否有一个与Python一起使用的存储库能够比SQLite更适合我的需求?

4 个答案:

答案 0 :(得分:2)

您是否在名称和描述上添加了索引?搜索5000个索引条目应该是基本上即时的(当然ORM会让你的生活变得更加困难,因为它们通常会[比较好的,比如SQLAlchemy,但尝试“原始sqlite”,它绝对应该飞)。

只写更新的条目(再次使用真正的SQL)也应该基本上是即时的 - 理想情况下,单个更新语句应该这样做,但即使是一千个也不应该是真正的问题,只需确保在开始时关闭自动提交循环(如果你想稍后再转回)。

答案 1 :(得分:1)

对于您的应用程序可能有点过分,但您应该检查无架构/面向文档的数据库。就个人而言,我是couchdb的粉丝。基本上,不是将记录存储为表中的行,而是像couchdb存储键值对,然后(在couchdb的情况下),您在javascript中编写视图以剔除您需要的数据。这些数据库通常比关系数据库更容易扩展,在您的情况下可能会更快,因为您不必将数据锤入适合关系数据库的形状。另一方面,这意味着还有另一项服务正在运行。

答案 2 :(得分:0)

鉴于所述对象的大致数量(约5,000),SQLite可能不是速度背后的问题。这是中介措施;例如JSON或可能非最佳地使用SQLAlChemy。

试试这个(即使对于百万个对象也相当快): y_serial.py module ::使用SQLite的仓库Python对象

“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“

http://yserial.sourceforge.net

你的密钥上的yserial搜索是使用SQLite端的正则表达式(“regex”)代码完成的,而不是Python,所以还有另一个显着的速度改进。

让我们知道它是如何运作的。

答案 3 :(得分:0)

我现在正在使用Nucular解决一个非常类似的问题,这可能符合您的需求。它是一个基于文件系统的存储,看起来非常快。 (它带有一个示例应用程序indexes the whole python source tree)它是并发安全的,不需要外部库,而且是纯Python。它快速搜索并具有强大的全文搜索,索引等等 - 一种专门的,正在进行中的本地python-dict商店,以时尚的Couchdb和mongodb的方式,但更轻。

它确实有局限性 - 它无法在嵌套字典上存储或查询,因此不是每种JSON类型都可以存储在其中。此外,虽然它的文本搜索功能强大,但它的数字查询很弱且没有索引。尽管如此,它可能正是你所追求的。