NSj*_*nas 6 .net memory-leaks blockingcollection
我正在使用带有> 的生产者/消费者模式System.Collection.Concurrent.BlockingCollection<DataTable
来从数据库(生产者)检索数据并在数据(消费者)上创建Lucene索引.
Producer一次抓取10000条记录并将该组添加到BlockingCollection<DataTable>
.然后消费者(稍微慢一点)抓住那些10000并创建一个索引.
阻塞集合被限制为<DataTable>
每个10000行中的5个.
起初程序运行得很好,但是在它获得大约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();
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以确认拒绝此暂停吗?还有什么工作吗?
是的,我可以证实这一点.你不是在.NET 4.5上,是吗?应该在那里修复(你在这个答案下的评论似乎证实了这一点).
无论如何,DataTable
当你完成表格时,自己写一个包装器并清除包装器.这使它符合GC的条件.包装器不会提前GC,但它很小.
class Wrapper<T> { public T Item; }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2055 次 |
最近记录: |