优化SQLite很棘手.C应用程序的批量插入性能可以从每秒85次插入到每秒超过96,000次插入!
背景:我们使用SQLite作为桌面应用程序的一部分.我们有大量的配置数据存储在XML文件中,这些数据被解析并加载到SQLite数据库中,以便在初始化应用程序时进行进一步处理.SQLite非常适合这种情况,因为它速度快,不需要专门配置,数据库作为单个文件存储在磁盘上.
理由: 最初我对我所看到的表现感到失望.事实证明,SQLite的性能可能会有很大差异(对于批量插入和选择),具体取决于数据库的配置方式以及如何使用API.弄清楚所有选项和技术是什么并不是一件小事,所以我认为创建这个社区wiki条目以与Stack Overflow读者分享结果是谨慎的,以便为其他人节省相同调查的麻烦.
实验:我不是简单地谈论一般意义上的性能提示(即"使用事务!"),而是认为最好编写一些C代码并实际测量各种选项的影响.我们将从一些简单的数据开始:
我们来写一些代码吧!
代码:一个简单的C程序,它逐行读取文本文件,将字符串拆分为值,然后将数据插入SQLite数据库.在代码的这个"基线"版本中,创建了数据库,但我们实际上不会插入数据:
/*************************************************************
Baseline code to experiment with SQLite performance.
Input data is a 28 MB TAB-delimited text file of the
complete Toronto Transit System schedule/route info
from http://www.toronto.ca/open/datasets/ttc-routes/
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "sqlite3.h"
#define INPUTDATA "C:\\TTC_schedule_scheduleitem_10-27-2009.txt"
#define DATABASE "c:\\TTC_schedule_scheduleitem_10-27-2009.sqlite"
#define …Run Code Online (Sandbox Code Playgroud) SQLAlchemy flush()和commit()SQLAlchemy 之间有什么区别?
我已经阅读了文档,但没有更明智 - 他们似乎假设我没有预先理解.
我对它们对内存使用的影响特别感兴趣.我正在从一系列文件(总共约500万行)中将一些数据加载到数据库中,并且我的会话偶尔会崩溃 - 它是一个大型数据库和一台内存不足的机器.
我想知道我是否使用了太多但commit()没有足够的flush()电话 - 但是如果没有真正了解其中的差异,那就很难说了!
我正在尝试使用SQLite数据库和Perl模块来解决问题.最后,我需要记录数以千万计的条目.每个项目唯一的唯一标识符是URL的文本字符串.我想以两种方式做到这一点:
方式#1:有一个好桌子,坏桌子,未分类的桌子.(我需要查看html并确定是否需要它.)假设我们总共有10亿个页面,每个表格中有3.33亿个URL.我有一个要添加的新URL,我需要检查它是否在任何表中,如果它是唯一的,则将其添加到Unsorted.另外,我会用这个选项移动很多行.
方式#2:我有2张桌子,Master和Good.Master拥有全部10亿个页面URL,而Good拥有我想要的3.33亿个页面URL.新的URL,需要做同样的事情,除了这次我只查询一个表,我永远不会从Master中删除一行,只将数据添加到Good.
所以基本上,我需要知道最好的设置,以快速查询一个巨大的SQLite数据库,看看大约20个字符的文本字符串是唯一的,然后添加,如果不是.
编辑:我现在正试图让Berkeley DB使用Perl模块工作,但没有骰子.这就是我所拥有的:
use BerkeleyDB;
$dbFolder = 'C:\somedirectory';
my $env = BerkeleyDB::Env->new ( -Home => $dbFolder );
my $db = BerkeleyDB::Hash->new (
-Filename => "fred.db",
-Env => $env );
my $status = $db->db_put("apple", "red");
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到以下内容:
Can't call method "db_put" on an undefined value at C:\Directory\perlfile.pl line 42, <STDIN> line 1.
Run Code Online (Sandbox Code Playgroud)