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

C++ SQLite importing entire CSV file in C Interface

本文关键字:CSV 文件 导入 接口 C++SQLite      更新时间:2023-10-16

有没有办法通过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位,Visual Studio 2010)

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

有没有办法引用文件的内存位置,这样就不需要导入了?若有的话,信息的访问速度慢吗?

SQLite可以将CSV文件作为二进制数据吗?这会加快导入文件的速度吗?

想法?

注意:我在C接口中使用":memory:"选项来在内存中加载DB以提高速度(我希望如此)。

编辑

在做了更多的优化之后,我发现了这一点。它解释了如何通过编写将insert语句分组到一个事务中。

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

这在性能上产生了巨大的改进。

有用的相关旁注

此外,如果您希望从查询结果创建表或将查询结果插入表,请尝试此方法创建表或此方法将结果插入表。

插入链接对于插入到表中可能不明显。要执行此操作的查询如下所示。

INSERT INTO [TABLE] [QUERY]

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

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

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