Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net C#程序中的大内存问题_.net_Memory Management_Memory Leaks_C# 4.0 - Fatal编程技术网

.net C#程序中的大内存问题

.net C#程序中的大内存问题,.net,memory-management,memory-leaks,c#-4.0,.net,Memory Management,Memory Leaks,C# 4.0,我有大量的实时数据需要尽快处理 这些数据来自多个网络连接线程 所有网络线程都将数据传递给一个共享函数,以对恢复的数据进行一些翻译和解释,然后它将信息作为一个对象一个对象地保存到并发字典中 问题是我有一个数量的对象可能会达到150K存储在这本字典。发生的情况是,在获取对象以进行更新时,需要花费大量时间,而不是接受的时间 public class MyObject { System.Timers.Timer LostTimer = new System.Timers.Timer(); p

我有大量的实时数据需要尽快处理

这些数据来自多个网络连接线程

所有网络线程都将数据传递给一个共享函数,以对恢复的数据进行一些翻译和解释,然后它将信息作为一个对象一个对象地保存到并发字典中

问题是我有一个数量的对象可能会达到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;
         }
      });
   });
 }
}
公共类MyObject
{  
System.Timers.Timer LostTimer=新的System.Timers.Timer();
公共int ID;
公共日期时间更新时间;
公共对象()
{
LostTimer.间隔=20000;
LostTimer.Appeased+=TimeRecursedHandler(LostTimer\u Appeased);
LostTimer.Enabled=true;
}
void LostTimer_已过(对象发送方,事件参数e)
{
if(UpdateTime>DateTime.Now.AddSeconds(-20))
Console.WriteLine(ID+“丢失…”);
}
}
公共类MyClass
{
公共MyClass(){}
私有ConcurrentDictionary对象=新建ConcurrentDictionary();
无效网络线程1数据接收(事件参数e)
{
翻译(如数据);
}
无效转换(字符串[]数据)
{
Task.Factory.StartNew(()=>
{
Parallel.ForEach(数据,s(()=>
{
MyObject o=null;
Objects.TryGet(int.Parse,out o)
如果(o==null)
{       
o=新的MyObject();
o、 ID=int.Parse;
o、 UpdateTime=DateTime.Now;
对象。TryAdd(s,o);
}
其他的
{
o、 UpdateTime=DateTime.Now;
}
});
});
}
}
现在,在处理超过30K的对象时,它会给我丢失的对象

逻辑是我从当前系统时间中减去对象宽限期,并将其与该对象的上次更新时间进行比较。 您是否认为这种类型的线程安全数组(字典)无法处理如此大量的数据,并导致读/写访问延迟,从而导致对象丢失

在我使用
List
Lock(Object){}
来处理对这个共享内存的多线程访问之前,它在10K个对象之后失败。在将它更改为dictionary(.Net build in thread safe List)之后,它可以很好地处理30K


我的目标是达到150K,我能用这个逻辑达到它吗?

所以,对于你添加的每个对象(30K个对象),你创建一个计时器。这就是30000个活动计时器

我认为这会产生很多开销


如果这只是为了记录/审核,您应该在1个计时器中完成。可能需要创建一个单独的列表/字典,列出您要记录的对象。

您的代码不会编译-
UpdateTime>DateTime.Now.AddSeconds(-20000)
无效,因为LHS是int,RHS是DateTime。如果我们看不到一些真实的代码,就很难诊断问题。同样,您对Parallel.ForEach的调用在语法上看起来也不正确……我纠正了它,很抱歉这是一个发布错误,代码有逻辑错误,而不是语法上编译得很好。谢谢逻辑是我从当前系统时间中减去对象宽限期,并将其与该对象的上次更新时间进行比较。您认为这种类型的线程安全数组(字典)不能处理如此大量的数据并导致读/写访问延迟,从而导致对象丢失吗???在我使用列表和锁之前(Object){}来处理对这个共享内存的多线程访问,但是在10K个对象之后它失败了。在将它更改为字典(.Net build in thread safe list)之后我的目标是达到15万桶,我将尝试删除每个对象计时器,并用全局计时器计算损失,而不是旧计时器。顺便说一句,所有对象必须在一定的宽限期内联机,请保持联系。。。