Проблема с большой памятью в C # - PullRequest
1 голос
/ 29 ноября 2010

все У меня большой объем данных в реальном времени, которые необходимо обработать как можно быстрее.

Эти данные поступают из потоков многосетевого соединения.

Все потоки сети проходятданные в разделяемую функцию, чтобы выполнить некоторый перевод и интерпретацию восстановленных данных, после чего она сохраняет информацию в словарь параллельных вычислений как объект за объектом.в этом словаре.

то, что происходит при получении объекта для обновления, занимает больше времени, чем допустимое время.

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 и Lock (Object) {} для обработки многопоточного доступа к этой общей памяти, но он не работает после 10 КБ объектов.после замены на словарь (.Net build in thread safe list) он хорошо работает с 30K.Моя цель - достичь 150K, могу ли я достичь этого с помощью этой логики, или у вас есть лучшие идеи.

1 Ответ

3 голосов
/ 29 ноября 2010

Итак, для каждого добавляемого вами объекта (30 тыс. Объектов) вы создаете таймер. Активировано 30 000 таймеров.

Я думаю, это создает много накладных расходов.

Если это только для регистрации / аудита, вы должны сделать это за 1 таймер. Возможно создать отдельный список / словарь объектов, которые вы хотите регистрировать.

...