【问题标题】:C++ SQLite importing entire CSV file in C InterfaceC++ SQLite在C接口中导入整个CSV文件
【发布时间】: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++


    【解决方案1】:

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

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

    【讨论】:

    • 这将时间缩短了大约一分钟。我认为我的代码中还有另一个瓶颈。 :/ 你有关于文件指针或二进制数据的想法吗?
    • 让我们看看你的循环。有什么声音响了;它不应该花那么长时间。 (我不知道二进制数据选项等)
    • 这与我打包数据并将其交给插入函数(为了可维护性)的方式有关。我将所有逻辑都放入解析循环中,我在 ~12 分钟,这要好得多。这似乎仍然很慢,但我确定是我。我会继续寻找可以添加到 O-Notation 并杀死它们的东西。谢谢!
    • 经过一些测试并移除了那个巨大的瓶颈。您的回答确实缩短了 2-5 分钟的时间。通过缓冲所有插入语句并在我到达文件末尾时提交它们,我正在运行大约 9.5 分钟,这是可用的。某处仍有改进的空间,但您的回答肯定有很大帮助。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多