【发布时间】:2011-11-25 15:15:52
【问题描述】:
这个问题与不同数据库引擎对 IR 和 AI 研究的适用性有关。下面的两个重要问题以粗体显示。
我正在使用 python 将 17 gig 纯文本语料库加载到 sqlite3 中。行项目填充三个表,单个标准化步骤为 1..*,平均每行 5 个条目。我的桌子上没有索引。我没有将插入语句批处理在一起,我可能应该这样做,但我只是在一百万行之后调用 sqlite 的提交消息(因此每行插入 3-8 个表)。事后看来,我可能应该将它们一起批处理成 1000 个值/插入。提交可能没有像我想象的那样做,它可能每隔几个条目就进行一次内部提交。
数据加载开始时受 CPU 限制,但现在 DB 大小为 33 gig,它似乎受 IO 限制。明文语料库和 db 文件都在同一个磁盘上。我假设 sqlite3 在预先填充它的页面时非常保守,现在正在左右和中心拆分页面。
无论如何,我现在可能会坚持使用 sqlite3,我猜它比企业级数据库的优势是能够临时创建多个数据库文件并将文件放在不同的磁盘上。传统上,我假设大多数人使用 postgres / Xapian / Sql Server 或 Oracle 来处理这类东西。
从经验来看 sqlite3 是阻碍 IR/AI 系统创建还是祝福?,我的意思是我什至还没有创建索引,数据已经加载了 14 小时。如果我要稳定地遇到如此巨大的加载时间,我可能会坚持使用 Sql Server 来进行未来的原型设计。 我知道 berkeley db 也有一个 sqlite3 接口,它应该具有事务性 mvcc 数据库的性能特征,有没有人有经验解决此类问题?
编辑
正如 James 提醒我的那样,事务切换会从等式中删除 2 次同步磁盘写入,因此我将禁用日志,其次我将禁用同步设置,以便引擎有机会在空闲时插入行,这意味着我希望它的行为就像我在批处理行插入一样。
C++ 可能只是用于数据加载的全面更好的语言(尤其是当涉及 3.4 亿行数据时),我预计大量无用的周期会浪费在内存复制和分配上。如果我错了,请纠正我,因为在 python 中编写一次性代码会更快。
【问题讨论】:
标签: database-design sqlite information-retrieval berkeley-db embedded-database