【发布时间】:2019-01-25 10:51:11
【问题描述】:
问题:随着时间的推移内存泄漏(累积),最终达到 99% 的容量。
我有以下 C# 代码,它使用 while 循环不断地将数据推送到 PostgreSQL 数据库中。我真的很挣扎,因为我不是C# 程序员。我的主要语言是Python。我一直在尝试查找 C# 引用来解决我的问题,但失败了,因为我根本不懂很多语法。 C# 代码是我公司的其他人编写的,但他现在不可用。
代码如下:
var connString = "Host=x.x.x.x;Port=5432;Username=postgres;Password=password;Database=database";
using (var conn = new Npgsql.NpgsqlConnection(connString)){
conn.Open();
int ctr = 0;
// Insert some data
while(@tag.TerminateTimeScaleLoop == 100)
{
@Info.Trace("Pushed Data: PostGre A " + ctr.ToString());
using (var cmd = new Npgsql.NpgsqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO TORQX VALUES (@r,@p)";
cmd.Parameters.AddWithValue("r", System.DateTime.Now.ToUniversalTime());
cmd.Parameters.AddWithValue("p", @Tag.RigData.Time.TORQX);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.CommandText = "INSERT INTO BLKPOS VALUES (@s,@t)";
cmd.Parameters.AddWithValue("s", System.DateTime.Now.ToUniversalTime());
cmd.Parameters.AddWithValue("t", @Tag.RigData.Time.BLKPOS);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
// @Info.Trace("Pushed Data: PostGre " + ctr.ToString());
}
ctr = ctr + 1;
}
@Info.Trace("Pushed Data: PostGre A Terminated");
代码一开始就成功建立了一个连接,并且整个过程只使用一个连接。它正确地将数据插入数据库。但是内存容量达到99%后,就不能很好的插入了。我能想到的问题的根源是这段代码不断地创建新对象,但在一次迭代完成后并没有清除该对象。谁能告诉我问题的根源在哪里并提供可能的解决方案?
++ 请理解我不是 C# 程序员...我对内存处理的概念不太熟悉。但我会尽力理解
【问题讨论】:
-
你可能只是因为循环太快和太多而压倒了垃圾收集器。尝试在循环之外创建命令和参数,这样每次迭代只创建一个实例而不是一个实例。在循环内设置 CommandText 和参数值。
标签: c# postgresql memory memory-management memory-leaks