这个问题与IR和AI研究中不同数据库引擎的适用性有关。这两个重要的问题在下面以黑体显示。
我正在使用python将17 gig纯文本语料库加载到sqlite3中。这些行项目以1 .. *的单个标准化步骤填充三个表,平均每行5个条目。我桌上没有索引。我并没有将批处理语句批处理在一起,但是我只在一百万行之后调用sqlite的提交消息(因此每行3-8个表插入)。事后看来,我可能应该将它们组合成1000个值/插入。提交可能没有按照我的预期去做,它可能每隔几个条目就进行一次内部提交。
数据加载从CPU限制开始,但是现在DB大小为33 gigs,似乎是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行。
我知道这不能完全回答您的问题,但希望对您有帮助。
关于database-design - 使用sqlite3构建大型OR/AI(信息检索/人工智能)系统,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8271051/