【发布时间】:2012-11-04 11:23:30
【问题描述】:
有没有办法通过 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 Studios 2010)
这对我的项目来说是不可接受的,所以我需要一种更快的方法,大约需要 2-3 分钟。
有没有办法引用文件的内存位置,所以不需要导入?如果是这样,信息的访问速度会很慢吗?
SQLite 可以将 CSV 文件作为二进制数据吗?这会使导入文件更快吗?
想法?
注意:我在 C 接口中使用“:memory:”选项将数据库加载到内存中以提高速度(我希望如此)。
编辑
在做了更多优化后,我找到了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] 的结果的表。
【问题讨论】:
标签: c++ performance sqlite visual-c++