Увеличение использования памяти в sqlite3? - PullRequest
0 голосов
/ 27 октября 2009

Я написал консольное приложение, которое получает события через boost :: interprocess memory и выгружает информацию в базу данных 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 ]

1 голос
/ 27 октября 2009

Я поддерживаю предложение попробовать это под валгриндом. Вы также можете посмотреть на замену tcmalloc от Google ... Он может печатать симпатичные графики, показывающие все ваши утечки ... Тем не менее, я надеюсь, что вы получите ответ на этот вопрос ... Я планирую использовать SQLite в будущем проекте. ..

0 голосов
/ 27 октября 2009

Как вы определяете использование памяти? У вас может не быть настоящей утечки.

Если вы работаете в системе Windows и используете Visual Studio, скомпилируйте в режиме отладки и используйте макросы отладки памяти, чтобы найти утечки.

Если вы работаете в системе на основе Unix, попробуйте valgrind / memcheck.

Я думаю, что xcode OS X также обнаруживает утечки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...