Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cassandra c#驱动程序内存泄漏_C#_Memory Leaks_Cassandra - Fatal编程技术网

cassandra c#驱动程序内存泄漏

cassandra c#驱动程序内存泄漏,c#,memory-leaks,cassandra,C#,Memory Leaks,Cassandra,使用cassandra.net驱动程序,我们面临以下问题: 使用参数化插入插入大量行时,应用程序内存使用量会不断增加: class Program { static Cluster cluster = Cluster.Builder() .AddContactPoints(ConfigurationManager.AppSettings["address"]) .Build(); static Session session = cluster

使用cassandra.net驱动程序,我们面临以下问题: 使用参数化插入插入大量行时,应用程序内存使用量会不断增加:

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);
    }
}
类程序
{
静态Cluster Cluster=Cluster.Builder()
.AddContactPoints(ConfigurationManager.AppSettings[“地址”])
.Build();
静态会话=群集
.Connect(ConfigurationManager.AppSettings[“键空间]);
静态整数计数器=0;
静态void Main(字符串[]参数)
{
对于(int i=0;i<50;i++)
{
新线程(()=>
{
while(true)
{
新人()
{
Name=Interlocked.Increment(ref counter).ToString(),
ID=Guid.NewGuid(),
数据=新字节[4096],
}.保存(会话);
}
}).Start();
}
Console.ReadLine();
}
}
班主任
{
公共Guid ID
{
得到;
设置
}
公共字符串名
{
得到;
设置
}
公共字节[]数据
{
得到;
设置
}
公共作废保存(会话)
{
秒表w=秒表.StartNew();
session.Execute(session.Prepare(
“插入个人(id、姓名、数据)值(?,?);”)
.Bind(this.ID、this.Name、this.Data));
Console.WriteLine({1}保存在{0}ms中),
w、 已用的.total毫秒,此.Name);
}
}
根据创建的内存转储,托管堆包含大量的小字节数组(其中大多数是第2代),可以追溯到内部Type解释器类中cassandra驱动程序的字节转换方法(InvConvert*)


您对如何解决此问题有何建议或想法?

如果可能,请尝试使用dispose。也许你的Garbace收藏无法清除它们。 您还应该编写Cassandra的开发人员。对我来说像个虫子


这对你有帮助吗?

对于其他遇到这种情况的人。我在创建大量的
Cassandra.ISession
s时出现了内存问题,尽管我通过
使用
语句正确地处理了它。将我的代码更改为重用单个
ISession
似乎已经解决了这个问题。我不知道这是否是最好的解决方案。

您正在为尝试插入的每条记录创建preparedstatement。在创建会话时尝试创建一次preparedstatement

是否执行
.Prepare
.Bind
中的任何一项执行
返回
IDisposable
?如果是,则处置它们。如果不是的话,你就不走运了,你正在使用的库可能有一个bug。谢谢你的回答。经过进一步的研究,将Prepare语句的结果存储在一个字段中并重用,内存占用减少了。似乎Cassandra库有一些内部问题,将与开发人员联系……我还想知道这是否是唯一的解决方案,因为据说Cassandra确实支持连接池(默认情况下为25)。根据您的想法,您确实需要创建一个
集群
实例和一个
会话
实例并重用这些实例。不要为Cassandra的每个查询创建新集群和会话