【问题标题】:sqlite3 database load to memory c++ and select perfomancesqlite3数据库加载到内存c ++并选择性能
【发布时间】:2014-02-13 05:35:34
【问题描述】:

在创建任何SELECTS 之前,有什么方法可以将sqlite3 数据库文件从磁盘加载到内存中? sqlite3_step() 工作真的很慢......所以我想将数据库加载到内存中以快速加载数据。

在 sqlite3 之前,我使用简单的二进制数据序列化,stackoverflow 的所有成员都建议我使用sqlite3 进行序列化,现在我的程序真的很慢.. 太慢了,我无法反序列化所有数据。 (序列化与事务配合得很好)

也许这也会有所帮助。我的SELECT: 每个未序列化的对象上有两个选择和两个sqlite3_step()。 对于两个查询,查询看起来像 SELECT aaaa,bbb,ccc,ddd,eee,ggg,hhh,fff,jjj FROM table。 第一个表具有唯一的 aaaa 键,但第二个表不是唯一的(所以它似乎根本没有索引)

更新:

    // Create SQL statement
    std::string sql_createtable = "CREATE TABLE IF NOT EXISTS ssssssss(" \
        "sid INTEGER PRIMARY KEY     NOT NULL," \
        "last_access_time       INT     ," \
        "last_c_time        INT     ," \
        "total_c           INT     ," \
        "last_viewed_lid INT ," \
        "last_viewed_ltid INT     );";  
//      "showed TEXT     );";

    std::string sql_showed = "CREATE TABLE IF NOT EXISTS showed(" \
        "sid              INT     NOT NULL," \
        "rid              INT     ," \
        "lid         INT     ," \
        "ltid           INT         );";    

选择 1:

SELECT sid, last_access_time, last_c_time, total_c, last_viewed_lid, last_viewed_ltid FROM ssssss

选择 2:

"SELECT rid, lid, ltid FROM showed WHERE sid= ?1"; // sid is from first table. can be more than 1 the same sid

嗯,第二张表showed 上的sid 似乎不是唯一且没有索引的问题?如何为该语句添加索引?

也许还有其他建议?

【问题讨论】:

  • 将数据加载到内存是操作系统的责任。它会做得很好。您的选择更有可能是非常不理想的。但为此,您必须向我们展示 exact 选择和架构(如果您需要匿名,则根据需要重命名列,但所有子句和条件必须匹配)。
  • @JanHudec 谢谢。完成。

标签: c++ sqlite


【解决方案1】:

您想添加索引。由于该列不是唯一的,您需要使用单独的命令添加它:

CREATE INDEX showed_sid ON showed (sid);

创建表后立即执行。

【讨论】:

  • 谢谢,它是我的最佳索引吗?我发现 sqlite.org/optoverview.html 这个(第 5.0 段跳过扫描优化)似乎需要将所有列添加到索引中?
  • @abrahab:如果你正在读取的所有列也是索引,sqlite 直接从索引中读取结果,不需要访问主表。但它扩大了指数并减慢了它的速度。因此,如果您有一个查询,它只是从一个表中读取了更多列,那么一定要这样做,并将结果列也添加到索引中。但是,如果您正在阅读所有列,它可能会快一点,也可能会慢一些。在任何一种情况下,与您通过索引获得的收益相比,差异都会很小。如果它确实对性能至关重要,则应该对其进行测试。
  • 谢谢你,现在我可以确认,通过你的解决方案,我的选择工作得更快,但现在新问题:(数据库很大,我得到bad_alloc,而在大表上进行反序列化:(不好,因为当我使用二进制数据文件进行序列化/反序列化时 - 我没有遇到过这样的问题。也许某处存在内存泄漏,但似乎我在每个 _step 上都做了 _reset...
  • @abrahab:sqlite 是纯 C 语言,不会给出 C++ 异常。此外,您确实需要通过实际耗尽它来浪费大量内存来获得bad_allocbad_alloc 最可能的原因是将无效大小传递给 new[]。至于_reset,它仅用于停止在重用它们之前会返回更多行的查询,我认为我从未使用过它。它甚至可能是您的问题的根源,因为它会丢弃该行,因此如果您在进行反序列化之前调用它,则反序列化将获得字符串和 blob 列的无效指针以及数字列的随机数。
  • std::sting 创建时崩溃(使用 new[] )。我似乎也对_reset 有性能问题,因为我在每个步骤中都调用它(在您发布答案之前,我认为当我将新值绑定到准备好的语句时,有必要在每个步骤中执行。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多