gpt4 book ai didi

c++ - 增加sqlite3中的内存使用量?

转载 作者:行者123 更新时间:2023-11-28 08:31:52 28 4
gpt4 key购买 nike

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

有人能告诉我我做错了什么吗?我是否遗漏了一些我应该取消分配的东西?

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

    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();
}
}

最佳答案

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

关于c++ - 增加sqlite3中的内存使用量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1630489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com