精易论坛

标题: sqlite3内存数据库内存递增问题 [打印本页]

作者: lele51998    时间: 2024-1-10 09:44
标题: sqlite3内存数据库内存递增问题
https://125.confly.eu.org/thread-14808507-1-1.html 原帖地址  使用的是https://125.confly.eu.org/forum.php?mod ... 0%E6%8D%AE%E5%BA%93这个模块    内存版和非内存版都一样       我的问题说的很明确     网络采集数据保存到数据库   所以是几分钟采集一次    数据是不停的在增加的    现在每增加一次数据内存就要增加10多M内存    上来了就下不去了   不会自动释放      到了1G多的内存占用程序就会崩溃       按照各路大神说的需要关闭     我关掉连数据都没办法采集了  再次打开读写也没有用      求数据库大佬解答


补充内容 (2024-1-10 09:48):
大佬可以看看我在原帖中的问题    就会明白我的问题点在哪里了    现在就是每增加一次数据到数据库中导致内存递增不会自动释放的问题

补充内容 (2024-1-10 13:29):
也许来个懂连接池使用的大佬能解决我的难题    我觉得应该在我每次入库后关闭数据库的连接   但是连接池依旧不影响查数据和下次新增
作者: 幻月工作室    时间: 2024-1-10 10:31
内存增加的多可能是你表创建的有问题,是否限制了字段长度,是否有多个索引,都是影响表空间的因素。而且sqilite确实是有一些垃圾数据留存,需要执行VACUUM命令才能清理掉。内存版一般是保存临时数据用,速度会相对快一点。非内存版是把数据保存在磁盘上,但数据是永久保存的
作者: w80561307    时间: 2024-1-10 10:58
可以使用SQL语句定期清理历史数据,结合SQL压缩语句(VACUUM;)使用。
例如:
delete  from ... where ....;
vacuum;
作者: lele51998    时间: 2024-1-10 11:50
w80561307 发表于 2024-1-10 10:58
可以使用SQL语句定期清理历史数据,结合SQL压缩语句(VACUUM;)使用。
例如:
delete  from ... where .... ...

这种语句不会真的把我历史数据给清了吧。。。
作者: w80561307    时间: 2024-1-10 11:57
lele51998 发表于 2024-1-10 11:50
这种语句不会真的把我历史数据给清了吧。。。

历史数据爬出来是否会有重复,如果有的话加上唯一性主键/索引,避免重复入库,再就是delete语句清除不需要的记录,清除后面跟着压缩命令语句。
作者: lele51998    时间: 2024-1-10 12:42
w80561307 发表于 2024-1-10 11:57
历史数据爬出来是否会有重复,如果有的话加上唯一性主键/索引,避免重复入库,再就是delete语句清除不需 ...

不会重复入库的      我只会采集真正需要的东西入库     现在的问题就是我只要入库就增加内存  删除历史数据不可取      无解    大佬还有啥招请告知

作者: lele51998    时间: 2024-1-10 13:25
幻月工作室 发表于 2024-1-10 10:31
内存增加的多可能是你表创建的有问题,是否限制了字段长度,是否有多个索引,都是影响表空间的因素。而且sq ...

在SQLite中,VACUUM命令主要用于整理数据库文件并回收未使用的磁盘空间,而不是直接清理内存。执行VACUUM命令可以使数据库文件更加紧凑,并且有助于提高性能和减少磁盘占用。

如果你的应用程序中存在内存不断增长的问题,通常情况是由于程序中的内存泄漏或者资源未正确释放所导致。执行VACUUM命令并不会直接解决这些问题。

要解决内存不断增加的问题,你需要仔细检查应用程序的代码,确保在每次数据库操作后都正确关闭连接、释放资源,并且避免创建过多的无用对象。另外,你还可以考虑使用工具来分析内存使用情况,便于查找内存泄漏的根本原因。

总之,虽然VACUUM命令对于整理数据库文件很有用,但它并不是解决应用程序内存递增问题的方法。解决内存递增问题需要仔细调查代码,并确保数据库连接和其他资源被正确管理和释放。
作者: lele51998    时间: 2024-1-10 13:49
// 初始化连接池
for i = 1 to initialPoolSize
    connection = createNewConnection()
    pool.addConnection(connection)

// 请求连接
connection = pool.getConnection()

// 执行数据库操作
executeQuery(connection, "SELECT * FROM table")

// 释放连接
pool.releaseConnection(connection)
我还是自己琢磨吧     这要把这个VB写法弄懂了    然后配合ADODB数据库连接池我觉得突破口就在这了
作者: a819881101    时间: 2024-1-13 03:16
一样的问题。 我这边好的一点是写入的数据很小。但是每次读取都会有几K的内存增加。现在没办法准备改多维数组对照数据写入。。。少个读取的步骤。 因为我每天修改的次数不多。目前只想到这个办法了。 你解决了的话。 也让我请教下




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4