cassandra c驱动程序内存泄漏
本文关键字:泄漏 内存 驱动程序 cassandra | 更新日期: 2023-09-27 18:29:59
使用cassandra.net驱动程序,我们面临以下问题:当使用参数化INSERT插入大量行时,应用程序内存的使用量会持续增长:
class Program
{
static Cluster cluster = Cluster.Builder()
.AddContactPoints(ConfigurationManager.AppSettings["address"])
.Build();
static Session session = cluster
.Connect(ConfigurationManager.AppSettings["keyspace"]);
static int counter = 0;
static void Main(string[] args)
{
for (int i = 0; i < 50; i++)
{
new Thread(() =>
{
while (true)
{
new Person()
{
Name = Interlocked.Increment(ref counter).ToString(),
ID = Guid.NewGuid(),
Data = new byte[4096],
}.Save(session);
}
}).Start();
}
Console.ReadLine();
}
}
class Person
{
public Guid ID
{
get;
set;
}
public string Name
{
get;
set;
}
public byte[] Data
{
get;
set;
}
public void Save(Session session)
{
Stopwatch w = Stopwatch.StartNew();
session.Execute(session.Prepare(
"INSERT INTO Person(id, name, data) VALUES(?, ?, ?);")
.Bind(this.ID, this.Name, this.Data));
Console.WriteLine("{1} saved in {0} ms",
w.Elapsed.TotalMilliseconds, this.Name);
}
}
根据创建的内存转储,托管堆包含大量的小字节数组(其中大多数是第2代),这些数组可以追溯到内部TypeInterpreter类中cassandra驱动程序的字节转换方法(InvConvert*)。
你对我们如何解决这个问题有什么建议或想法吗?
对于其他遇到这种情况的人。我在创建大量Cassandra.ISession
时遇到了内存问题,尽管我通过using
语句正确地处理了它。更改我的代码以重用单个ISession
似乎已经修复了它。我不知道这是否是最好的解决方案。
您正在为要插入的每条记录创建准备好的语句。在创建会话时,请尝试创建一次准备好的语句。
如果可能的话,请尝试使用dispose。也许你的Garbace系列无法清除它们。您还应该编写Cassandra的开发人员。对我来说似乎是个bug。
这对你有帮助吗?