使用sqlite3构建大规模OR / AI(信息检索/人工智能)系统

时间:2011-11-25 15:15:52

标签: database-design sqlite information-retrieval berkeley-db embedded-database

这个问题与不同数据库引擎在IR和AI研究中的适用性有关。以下两个重要问题以粗体显示。

我正在使用python将17 gig明文语料库加载到sqlite3中。这些行项目填充了三个表格,其中一个标准化步骤为1 .. *,平均每行5个条目。我桌子上没有索引。我不是将insert语句一起批处理,我可能应该这样做,但是我只在一百万行之后调用sqlite的提交消息(因此每行3-8个表插入)。事后来看,我应该将它们一起分成1000个值/插入。提交可能不是我想的那样,它可能会在内部提交每一个条目。

数据加载是从CPU绑定开始的,但现在DB大小是33 gigs,它似乎是IO绑定的。明文语料库和db文件都在同一个磁盘上。我假设sqlite3非常保守,预先填充它的页面,并且现在正在分割页面左右中心。

无论如何,我现在可能会坚持使用sqlite3,这比企业级db的优势我想是能够ad-hoc创建多个数据库文件并将文件放在不同的磁盘上。传统上我假设大多数人使用postgres / Xapian / Sql Server或Oracle来处理这种事情。

从经验来看,sqlite3是IR / AI系统创建或祝福的障碍吗?,我的意思是我还没有创建索引,数据已经加载了14个小时。如果我要稳定地遇到如此巨大的加载时间,我可能会坚持使用Sql Server进行未来的原型设计。 我知道berkeley db也有一个sqlite3接口,它应该具有事务性mvcc数据库的性能特征,任何人都有任何经验可以解决这些问题吗?

修改

正如James提醒我的那样,切换事务会从等式中删除2个同步磁盘写入,因此我将禁用日志,其次我将禁用同步设置,以便引擎有机会自行插入行,意思是我希望它表现得好像我正在批处理行插入。

C ++可能只是用于数据加载的全面更好的语言(特别是当涉及到3.4亿行数据时),我预计在内存副本和分配上会浪费大量无用的循环。如果我错了,请纠正我,因为在python中编写一次性代码更快。

2 个答案:

答案 0 :(得分:4)

只是一个建议,但我会想到这么多的数据(除非你有一个非常简单的访问模式),任何'真正的'DB将严重超越sqlite3(尽管测试这个...),(milage将随着可用的引擎类型和系统资源 - ram,cpu)。另外 - 如果你不使用事务,Sqlite将为每个插入执行一个事务。每个事务需要2个盘旋转,因此驱动速度是这里的限制器。尝试做一个史诗般的交易,看看需要多长时间。如果系统进入中间数据导入的风险很小(或数据丢失的危险),那么您无需担心,也不需要每1K行提交一次。

我意识到这并没有完全回答你的问题,但我希望它证明是有帮助的。

答案 1 :(得分:1)

您的数据是什么结构?看看一些不那么传统的数据存储选项可能是值得的。这篇文章略显陈旧,但它很好地展示了其他一些选项:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

作为NoSQL信息的后续内容,您是否考虑过与思考并行?如果您可以拥有多个可以接受写入的数据存储节点,您可以考虑将多个作业设置为同时插入数据吗?

即使您想坚持使用RDBS,我也建议您使用Postgres(甚至是MySQL),因为它们并不比sqlite复杂得多,并带来更多功能(包括性能(取决于使用情况)) ,您仍然可以决定实际数据文件的位置。如果可能的话,尝试让您正在读取的数据和您正在编写的数据文件位于物理上独立的磁盘上(即完全不同的主轴,而不仅仅是不同的逻辑卷),因此磁盘磁头不会肆意破坏和浪费时间。即使将数据放在单独的机器上并通过iSCSI(1GBbit)连接它也可能更快。

用于插入数据的语言不应该很重要(特别是与最终查询数据时所做的相比),因为它所做的一切都是从磁盘读取并通过套接字发送。 (如果你的代码很糟糕就会产生影响!)