2

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

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

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

就像 apt-get 一样。

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

4

4 回答 4

2

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

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

于 2009-07-21T02:29:57.857 回答
1

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

于 2009-07-21T03:06:08.093 回答
0

我现在正在使用Nucular为自己解决一个非常类似的问题,这可能适合您的需求。这是一个基于文件系统的存储,看起来确实非常快。(它带有一个索引整个 python 源代码树的示例应用程序)它是并发安全的,不需要外部库并且是纯 python。它搜索速度快,并具有强大的全文搜索、索引等功能——类似于流行的 Couchdb 和 mongodb 的方式,一种专门的、进程内的、本地的 python-dict 存储,但更轻。

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

于 2010-12-17T08:41:18.860 回答
0

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

试试这个(即使是百万个对象也相当快):y_serial.py 模块 :: 使用 SQLite 存储 Python 对象

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

http://yserial.sourceforge.net

对您的键的 yserial 搜索是使用 SQLite 端的正则表达式(“regex”)代码完成的,而不是 Python,因此还有另一个显着的速度改进。

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

于 2010-03-03T16:27:50.463 回答