【发布时间】:2010-11-29 08:24:29
【问题描述】:
我有大量实时数据需要尽快处理。
这些数据来自多个网络连接线程。
所有网络线程都将数据传递给一个共享函数,对恢复的数据进行一些翻译和解释,然后将信息作为一个对象一个对象保存到并发字典中。
问题是我的字典中存储的对象数量可能达到 150K。发生的情况是在获取对象进行更新时需要花费很多时间,而不是接受的时间。
public class MyObject
{
System.Timers.Timer LostTimer = new System.Timers.Timer();
public int ID;
public DateTime UpdateTime;
public MyObject()
{
LostTimer.Interval = 20000;
LostTimer.Elapsed+=TimerElapsedHandler(LostTimer_Elapsed);
LostTimer.Enabled = true;
}
void LostTimer_Elapsed(object sender,EventArgs e)
{
if(UpdateTime > DateTime.Now.AddSeconds(-20))
Console.WriteLine(ID + " Lost...");
}
}
public class MyClass
{
public MyClass(){}
private ConcurrentDictionary<int,MyObject> Objects = new ConcurrentDictionary<int,MyObject>();
void NetworkThread1DataRecived(eventArgs e)
{
Translate(e.Data);
}
void Translate(string[] data)
{
Task.Factory.StartNew(()=>
{
Parallel.ForEach(data, s (()=>
{
MyObject o = null;
Objects.TryGet(int.Parse(s),out o)
if(o == null)
{
o = new MyObject();
o.ID = int.Parse(s);
o.UpdateTime = DateTime.Now;
Objects.TryAdd(s,o);
}
else
{
o.UpdateTime = DateTime.Now;
}
});
});
}
}
现在在处理超过 30K 的对象时,它会让我丢失对象。
逻辑是我从当前系统时间中减去对象宽限期,并将其与该对象的上次更新时间进行比较。 您是否认为这种线程安全数组(字典)无法处理如此大量的数据并导致读/写访问延迟导致对象丢失?
在我使用List<MyObject> 和Lock(Object){} 来处理对这个共享内存的多线程访问之前,但是在10K 个对象之后它就失败了。将其更改为字典(.Net 内置线程安全列表)后,它适用于 30K。
我的目标是达到150K,按这个逻辑能达到吗?
【问题讨论】:
-
您的代码无法编译 -
UpdateTime > DateTime.Now.AddSeconds(-20000)无效,因为 LHS 是 int 而 RHS 是 DateTime。如果我们看不到一些真实的代码,就很难诊断出问题。同样,您对 Parallel.ForEach 的调用在语法上看起来也不正确... -
我纠正得很好,很抱歉这是一个发布错误,代码有逻辑错误,而不是在语法上都编译得很好。谢谢
-
逻辑是我从当前系统时间中减去对象宽限期,并将其与该对象的最后更新时间进行比较。您是否认为这种类型的线程安全数组(字典)无法处理如此大量的数据并导致读/写访问延迟导致对象丢失???在我使用 List 和 Lock(Object){} 处理对此共享内存的多线程访问之前,但在 10K 个对象之后它失败了。将其更改为字典(.Net 内置线程安全列表)后,它适用于 30K。我的目标是达到 150K
标签: .net memory-management memory-leaks c#-4.0