C ++ SQLite在C接口中导入整个CSV文件

时间:2012-11-15 19:24:57

标签: c++ performance sqlite visual-c++

有没有办法通过C接口将整个CSV文件导入SQLite?

我知道命令行导入看起来像这样,

   sqlite> .mode csv <table>
   sqlite> .import <filename> <table>

但我需要能够在我的程序中执行此操作。

我还应该注意到,我已经成功地用C ++创建了一个CSV读取器,它读取CSV文件并逐行将其内容插入到表中。

这可以完成工作但是使用包含730k行的CSV这种方法需要大约20分钟才能加载,这太长了。 (这将是正在处理的东西的平均大小)

(机器:Intel(R)Core(TM)2 Duo CPU E8500 @ 3.16GHz 3.17GHz,4.0 GB Ram,Windows 7 64 bit,Visual studios 2010)

这对我的项目来说是不可接受的,所以我需要一种更快的方式,大概需要2-3分钟。

有没有办法引用文件的内存位置,所以不需要导入?如果是这样,信息访问速度慢?

SQLite可以将CSV文件作为二进制数据吗?这会更快地导入文件吗?

想法?

注意:我在C接口上使用“:memory:”选项将DB加载到内存中以提高速度(我希望)。

修改

在做了一些更优化之后,我找到了this。它解释了如何通过编写将插入语句分组为1个事务。

BEGIN TRANSACTION;
INSERT into TABLE VALUES(...);
...Million more INSERT statements
INSERT into TABLE VALUES(...);
COMMIT;

这创造了巨大的性能提升。

有用的相关备注

此外,如果您要查询查询结果中的创建表或将查询结果插入表格,请尝试this创建表格,或this将结果插入表格。

插入链接可能不适合插入表格。执行此操作的查询如下所示。

INSERT INTO [TABLE] [QUERY]

其中[TABLE]是您希望运行的查询的[QUERY]结果的表格。

1 个答案:

答案 0 :(得分:2)

  

我已经成功地用C ++创建了一个CSV读取器,它读取一个CSV文件并逐行将其内容插入到一个表格中......需要大约20分钟才能加载

将所有插入内容放入一个事务中 - 或者每个事务至少批量处理100或1000行 - 我希望您的程序运行得更快。