4

有没有办法通过 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:”选项将数据库加载到内存中以提高速度(我希望如此)。

编辑

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

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

这创造了性能的巨大改进。

有用的相关附注

此外,如果您要从查询结果中创建表或将查询结果插入表中,请尝试使用方法创建表或将结果插入表中。

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

INSERT INTO [TABLE] [QUERY]

[TABLE]您希望[QUERY]正在运行的查询结果进入的表在哪里。

4

1 回答 1

2

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

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

于 2012-11-15T19:39:55.377 回答