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

Posted

技术标签:

【中文标题】使用 sqlite3 构建大规模 OR/AI(信息检索/人工智能)系统【英文标题】:Building large scale IR/AI (information retrieval / Artificial Inteligence) systems with sqlite3 【发布时间】: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 中编写一次性代码会更快。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

嗯应该禁用事务,这解决了一个瓶颈:D【参考方案2】:

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

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

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

您用于插入数据的语言不应该那么重要(尤其是与您最终查询数据时所做的任何事情相比),因为它所做的只是从磁盘读取并通过套接字发送。 (也就是说,如果你的代码很糟糕,它会产生影响!)

【讨论】:

【参考方案3】:

我在使用 BDB 时获得了惊人的加载速度,尤其是在嵌入式模式下的 C++(即没有客户端服务器通信)。 在旧机器上(8 年前):每秒 50,000 条记录。 试试看。

【讨论】:

以上是关于使用 sqlite3 构建大规模 OR/AI(信息检索/人工智能)系统的主要内容,如果未能解决你的问题,请参考以下文章

如何搭建AI数据中台?

转iOS开发24:使用SQLite3存储和读取数据

合并 SQLite3 源的小型构建

探寻“智能”最优解,智能时代的“操作系统”成思路

大会倒计时 | 亚马逊云科技创新大会邀您一起构建AI新引擎 !

做一款互联网内容平台,到底要懂多少AI?