【问题标题】:Problem with large memory in a C# programC#程序中的大内存问题
【发布时间】: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&lt;MyObject&gt;Lock(Object){} 来处理对这个共享内存的多线程访问之前,但是在10K 个对象之后它就失败了。将其更改为字典(.Net 内置线程安全列表)后,它适用于 30K。

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

【问题讨论】:

  • 您的代码无法编译 - UpdateTime &gt; 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


【解决方案1】:

因此,为您添加的每个对象(30K 对象)创建一个计时器。那是 30.000 个计时器处于活动状态。

我认为这会产生很多开销。

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

【讨论】:

  • 谢谢,我会尝试删除每个对象计时器并通过全局计时器而不是旧计时器计算丢失。顺便说一句,所有对象必须在一定的宽限期内在线,请保持联系...
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多