gpt4 book ai didi

c++ - SQLite3 - 内存使用量逐渐增加,直到消耗完所有可用内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:22 28 4
gpt4 key购买 nike

我在长时间运行一个简单的单线程 C++ 程序时遇到了内存使用问题(比如整晚)。该程序使用 SQLite3 API 打开数据库并在循环中向其中写入一些数据。我在两台不同的机器上运行该程序:桌面 Ubuntu Linux 和基于 ARM 的嵌入式设备运行定制的 Linux。在这两种情况下,我都得到了相同的结果:内存逐渐消耗并且在应用程序运行时没有释放。我正在使用在后台运行的简单 bash 脚本检查内存使用情况:

while true;
do free -m;
sleep 2;
done

应该注意的是,我还使用 SQLite 提供的 API 监视内存使用情况:

sqlite3_memory_used() 

API 报告的已用内存量相当稳定,但“free -m”报告不同,并且逐渐增加。

SQLite 源代码使用以下标志编译:

SQLITE_DEFAULT_TEMP_CACHE_SIZE=3
SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=2
SQLITE_MAX_MMAP_SIZE=2048
SQLITE_ENABLE_MEMSYS5
SQLITE_ENABLE_MEMORY_MANAGEMENT
SQLITE_DEFAULT_CACHE_SIZE=3
SQLITE_DEFAULT_AUTOVACUUM=1
SQLITE_DEFAULT_PAGE_SIZE=512

请注意,在这个阶段我不关心速度,但我主要关心的是内存使用,所以我设置参数时将最少的数据缓存在内存中并尽快将它们推送到磁盘。

我还在每次迭代中使用“PRAGMA shrink_memory”。

为了尽量减少动态内存分配,我还为以下内存类型提供了静态数组:

SQLITE_CONFIG_HEAP
SQLITE_CONFIG_SCRATCH
SQLITE_CONFIG_PAGECACHE

写入数据库的代码片段如下所示:

char SQL_Statement[100]={0};
char *ErrMsg = 0;
for (int i = 0; i < 1000000; i++)
{
sprintf(SQL_Statement, "INSERT INTO PointValue (TimeStamp, BlockId, PointId, Value) VALUES (%f, %d, %d, %d);",TimeStamp_ ,BlockId_, PointId_, Value_ );
check = sqlite3_exec(MyDB, SQL_Statement, callback, (void*)data, &ErrMsg);
sqlite3_free(ErrMsg);
}

最佳答案

感谢大家的回答和评论。确认内存被 linux 页面缓存消耗,这很好,因为 Linux 希望处理它并在另一个应用程序需要更多内存时释放不必要的页面。只需使用一个简单的命令:

cat /proc/meminfo

关于c++ - SQLite3 - 内存使用量逐渐增加,直到消耗完所有可用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748051/

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