C#程序中内存大的问题

问题描述 投票:1回答:1

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

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

[所有网络线程都将数据传递给共享功能,以对恢复的数据进行一些转换和解释,之后将信息逐对象保存到并发字典中。

问题是,我在此字典上存储的对象数量可能达到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的对象时,它使我丢失了对象。

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

[在使用List<MyObject>Lock(Object){}处理对该共享内存的多线程访问之前,但是在10K个对象之后,它失败。将其更改为字典(.Net内置在线程安全列表中)后,它与30K兼容。

我的目标是达到150K,我可以按照这种逻辑达到它吗?

.net memory-management memory-leaks c#-4.0
1个回答
3
投票

因此,对于添加的每个对象(3万个对象),您将创建一个计时器。多数民众赞成在30.000个计时器处于活动状态。

我认为这会产生大量开销。

如果仅用于记录/审核,则应在1个计时器中执行此操作。可能创建您要记录的对象的单独列表/字典。

© www.soinside.com 2019 - 2024. All rights reserved.