增加sqlite3中的内存使用量?

时间:2009-10-27 12:30:17

标签: c++ sqlite

我编写了一个控制台应用程序,它通过boost :: interprocess内存接收事件,并将信息转储到sqlite3数据库中。在运行应用程序时,我注意到,在Windows任务管理器中,内存使用量每30秒-1分钟就会周期性地增加。这让我相信问题在于我执行SQL的主循环。我添加了一些监控,显然sqlite3_memory_usage每次循环迭代都会返回增加的结果。

有人可以告诉我,我做错了什么吗?我错过了我应该取消分配的东西吗?

这是我用来生成SQL的两个字符串

    const std::string sql_insert =
      "INSERT INTO EventsLog "
      "(Sec, uSec, DeviceId, PmuId, EventId, Error, Msg) "
      "VALUES (%ld, %ld, %ld, %d, %ld, %d, %Q)";

    const std::string sql_create =
      "CREATE TABLE IF NOT EXISTS EventsLog("
      "Id INTEGER PRIMARY KEY AUTOINCREMENT, "
      "Sec INTEGER NOT NULL, "
      "uSec INTEGER NOT NULL, "
      "DeviceId INTEGER NOT NULL, "
      "PmuId INTEGER NOT NULL, "
      "EventId INTEGER NOT NULL, "
      "Error INTEGER NOT NULL, "
      "Msg TEXT"
      ")";

在这里,我生成SQL INSERT命令

std::string construct_sql_query
    (const ELMessageData & data)
    {
      std::string query = "";

      ptime jan1st1970 = ptime(date(1970,1,1));
      ptime now = boost::posix_time::microsec_clock::universal_time();
      time_duration delta = now - jan1st1970;
      TimeVal time((uint32)delta.total_seconds(),
                   (uint32)now.time_of_day().fractional_seconds());

      char * const sql = sqlite3_mprintf(sql_insert.c_str(),
                                         time.tv_sec,
                                         time.tv_usec,
                                         data.getDeviceId(),
                                         data.getPmuId(),
                                         data.getEventId(),
                                         (data.getIsError() ? 1 : 0),
                                          data.getExMsg().c_str());
      if(sql == NULL)
        post_event(EvIOError("Failed to create the SQL command",
                             "StLoggingEvents::_construct_sql_query"));

      query = std::string(sql);
      sqlite3_free(sql);

      return query;
    } // construct_sql_query

这是我执行INSERT命令的主循环

 while(true)
    {
      m_exchange_obj->wait(); // wait for the semaphore to be raised
  const std::string sql = construct_sql_query
    (m_exchange_obj->receive());

  char ** err = NULL;

  const int rc = sqlite3_exec(m_db_handle,
                              sql.c_str(),
                              NULL,
                              NULL,
                              err);
  sqlite3_free(err);

  if(rc != SQLITE_OK)
  {
    LERR_ << "Error while inserting into the database";
    LERR_ << "Last SQL Query : ";
    LERR_ << sql;
  }
  else
  {
    LDBG_ << "Event logged...";
    LDBG_ << "Sqlite3 memory usage : "
          << sqlite3_memory_used();
  }
}

2 个答案:

答案 0 :(得分:1)

我第二个建议在valgrind下尝试这个。您可能还想看看google的tcmalloc替换...它可以打印漂亮的图表显示您的所有泄漏...也就是说,我希望您能得到答案...我计划在即将开展的项目中使用SQLite。 ..

答案 1 :(得分:0)

您如何确定内存使用情况?你可能没有真正的泄密。

如果您使用的是Windows系统并使用visual studio,请在调试模式下编译并使用内存调试宏来查找泄漏信息。

如果您使用的是基于unix的系统,请尝试valgrind / memcheck。

我认为OS X的xcode也可以检测泄漏。