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



这个问题是关于IR和AI研究中不同数据库引擎的适用性。

我正在使用python加载一个17 gig明文语料库到sqlite3。行项用单个规范化步骤1填充三个表。平均每行5个条目。我在这些表上没有索引。我没有将插入语句批处理在一起,我可能应该这样做,但是我只在一百万行之后调用sqlite的提交消息(因此每行3-8个表插入)。事后看来,我应该把它们批处理成1000个值/插入。Commit可能没有做我想的那样,它可能每隔几个条目就进行内部提交。

数据加载开始是CPU绑定的,但是现在DB的大小是33g,它似乎是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中编写一次性代码更快。

只是一个建议,但我本以为有这么多数据(除非你有一个非常简单的访问模式),任何'真正的' DB都会严重优于sqlite3(请进行测试…)(里程将因引擎类型和可用的系统资源而异- ram, cpu)。另外,如果你不使用事务,Sqlite将为每次插入执行一个事务。每个事务需要2个磁盘旋转,因此驱动器速度是这里的限制因素。尝试执行一个大型事务,看看需要多长时间。如果在数据导入过程中系统崩溃的风险(或数据丢失的风险)很小,那么您就没有什么可担心的,并且您不需要每1K行提交一次。

我知道这并不能完全回答你的问题,但我希望它能对你有所帮助。

您的数据在什么结构中?有必要看看一些不太传统的数据存储选项。这是一篇有点旧的文章,但它很好地展示了其他一些选项:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

作为NoSQL信息的后续,您是否考虑过并行思考?如果您可以有多个数据存储节点,它们都可以接受写操作,那么您是否可以考虑同时设置多个作业来插入数据?

即使你想坚持使用RDBS,我真的会建议使用Postgres(甚至MySQL),因为它们并不比sqlite复杂得多,而且带来了更多的功能(包括性能(取决于使用)),你仍然有能力决定实际数据文件的位置。如果可能的话,尝试将您正在读取的数据和您正在写入的数据文件放在物理上独立的磁盘上(即完全不同的轴,而不仅仅是不同的逻辑卷),这样磁盘磁头就不会来回抖动并浪费时间。即使将数据放在单独的机器上,并通过iSCSI (1GBbit)连接,也很可能证明速度更快。

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

我对BDB有惊人的加载速度,特别是在嵌入式模式下的c++(即没有客户端服务器通信)。在旧机器上(8年前):每秒50,000条记录。试试。

最新更新