gpt4 book ai didi

.net - .Net Concurrent BlockingCollection 有内存泄漏吗?

转载 作者:行者123 更新时间:2023-12-02 02:57:54 25 4
gpt4 key购买 nike

我正在使用 Producer/Consumer PatternSystem.Collection.Concurrent.BlockingCollection<DataTable > 从数据库(生产者)检索数据并在数据上创建 Lucene 索引(消费者)。

生产者一次抓取 10000 条记录并将添加到 BlockingCollection<DataTable> 。然后消费者(稍微慢一点)获取这 10000 个并创建一个索引。

阻塞集合限制为 5 <DataTable>每行 10000 行。

起初程序运行得很好,但在输入大约 150000 行后,我注意到我的计算机内存已满,速度慢得像爬行一样。

BlockingCollection 似乎无法将底层数组槽设置为 null元素被拿走后。

代码:

    private static LuceneIndex index;
private static BlockingCollection<DataTable> blockingCol;

private static void Producer()
{
while (true)
{
//...get next 10000 rows
DataTable data = GetNextSet();
if(data.Row.Count > 0)
blockingCol.Add(products);
else
break;
}
}

private static void Consumer()
{
while (!BlockingCol.IsCompleted || BlockingCol.Count > 0)
{
DataTable data = blockingCol.Take();
index.UpdateIndex(GetLuceneDocs(data));
}
}


public static void Main(System.String[] args)
{
index = new LuceneIndex();
blockingCol = new BlockingCollection<DataTable>(2);
// Create the producer and consumer tasks.
Task Prod = new Task(Producer);
Task Con = new Task(Consumer);
// Start the tasks.
Con.Start();
Prod.Start();
// Wait for both to finish.
try
{
Task.WaitAll(Con, Prod);
}
catch (AggregateException exc)
{
Console.WriteLine(exc);
}
finally
{
Con.Dispose();
Prod.Dispose();
blockingCol.Dispose();
}
}

任何人都可以确认拒绝此暂停吗?有什么解决办法吗?

最佳答案

是的,我可以确认这一点。您没有使用 .NET 4.5,是吗?它应该在那里得到修复(并且您在此答案下的评论似乎证实了这一点)。

无论如何,请为 DataTable 编写一个包装器,并在使用完该表后清除该包装器。这使其符合 GC 资格。包装器不会被提前 GC,但它很小。

class Wrapper<T> { public T Item; }

关于.net - .Net Concurrent BlockingCollection 有内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824519/

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